1.指针的介绍
1.1指针的作用
C语言的一种数据类型。可用于表示一些复杂的数据结构。方便表示一些字符串和数组。可用于参数传递等。
1.2指针与指针变量
1.2.1变量的地址:
例:定义变量: int a=10;此时可以通过&a获得a的地址(int----4个字节)。
系统分配存储单元,存储单元可能占一定的字节数。
内存单元以字节为单位,内存中的每个字节都对应一个地址,通过地址才能找到每个字节。
&a以第一个内存单元的地址为准(高的---首地址)。
1.2.2指针引入
&-----获得变量的地址。
将a的地址存到另外一个变量中?如下图中的变量b
变量b=&a,则变量b成为指针变量;而指针就是存的那个地址,即&a是a的地址,&a指向了变量a。(这里有点绕)这样通过变量地址可以找到变量。
1.2.3指针变量的定义
例:
int a=10;
int *p=&a;
*------指针运算符
p-----指针变量(相当于上图中的变量b)
p里面存储的是变量a的地址。
注意:指针就是一个地址!!!
定义一个存放变量地址的变量就是一个指针变量。指针变量是一个变量,会分配内存空间,而指针本身不会分配内存空间。
1.2.4总结
变量的地址称为指针。
用于存储指针(即变量的地址)的变量叫指针变量;指针变量的值就是变量的地址,也就是指针。
1.3指针定义与初始化
1.3.1.指针的定义
格式: 类型说明符 *指针变量名;-----------定义一个指针变量。
类型说明符表示本指针(&a)所指向的变量(变量a)的数据类型
例:
int a=10;
int *p=&a;
int a=10;
/**
* 定义指针变量p1(也可以简称为定义指针p1,但p1实际本身是一个指针变量。),但要清楚指针变量与指针是不同的概念。
* 指针指向一个整型变量
*/
int *p1=&a;
char ch='c';
/* 定义指针p2,指针指向一个字符变量*/
char *p2=&ch;
指针变量占有的空间大小:
/* 指针变量占据的空间大小*/
printf("p1=>size:%d p2=>size:%d\n", sizeof(p1), sizeof(p2));
运行结果:
p1=>size:4 p2=>size:4
只要是指针变量就是占据4个字节。
根据指向变量的数据类型的不同,指针可以分为整型指针、字符型指针、浮点型指针、数组指针和其他数据类型指针。
1.3.2变量的直接访问和变量的间接访问
还是以下面这串代码为例:
int a=10;
/**
* 定义指针变量p1(也可以简称为定义指针p1,但p1实际本身是一个指针变量。),但要清楚指针变量与指针是不同的概念。
* 指针指向一个整型变量
*/
int *p1=&a;
char ch='c';
/* 定义指针p2,指针指向一个字符变量*/
char *p2=&ch;
1.3.2.1变量的直接访问
1.直接修改
a=20;
ch='c';
/* 直接访问*/
printf("a=%d ch=%c\n",a,ch);
运行结果:
a=20 ch=c
1.3.2.2变量的间接访问
2.通过指针间接修改
*p1=30;
*p2='A';
/*间接访问*/
printf("a=%d ch=%c\n",*p1,*p2);
运行结果:
a=30 ch='A'
通过指针去访问其所指向变量的值。
1.3.3指针的初始化
1.初始化为NULL
指针变量=NULL;
例:
*p=NULL
称为空指针,它不指向任何变量。
指针定义后不进行初始化会产生“野指针”。
2.初始化为某个变量的地址
例:
指针变量=&变量。
&为取地址运算符,用于获取变量的地址。
3.定义的同时进行初始化
类型说明符 *指针变量=NULL
类型说明符 *指针变量=&变量
指针变量专门用于存放地址,不能将其他任何非地址类型的数据赋给一个指针变量。一个指针只能指向统一做类型的变量。
1.3.4示例
1.
printf("&a=%p &a=%p\n",&a,p1);/*输出变量的地址*/
用%p来输出地址
输出结果:
&a:0xbff8dbcc &a:0xbff8dbcc