一、细说指针
1、指针的类型:
只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
这是指针本身所具有的类型
2、指针所指向的类型:
把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型
指向的类型决定了编译器将把那片内存区里的内容当做什么来看待
3、指针的值:
一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域
同样的 一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址
二、指针的加减:
对指针的加减操作就是将指针所指向的地址向高地址或低地址移动指针所指向类型的字节长度
char a[20];
int *ptr=(int *)a; //强制类型转换并不会改变a 的类型
ptr++;
例子中,指针本来指向数组a的0号单元开始的4个字节的数据(int长度为4字节)
指针ptr加了1,表示其指向的地址向高位移动了四个字节(int长度为4字节)
又因为char的长度为1字节,所以最终结果是指针ptr指向了数组a的4号单元开始的4个字节的数据
三、运算符&和*
&a的结果是一个指针,指针的类型是a的类型加个*,所指向的类型是a的类型,所指向的地址是a的地址
*p的结果是p所指向的内容,它的类型是p所指向的类型,地址是p所指向的地址
int a=12; int b; int *p; int **ptr;
p=&a; //&a 的结果是一个指针,类型是int*,指向的类型是
//int,指向的地址是a 的地址。
*p=24; //*p 的结果,在这里它的类型是int,它所占用的地址是
//p 所指向的地址,显然,*p 就是变量a。
ptr=&p; //&p 的结果是个指针,该指针的类型是p 的类型加个*,
//在这里是int **。该指针所指向的类型是p 的类型,这
//里是int*。该指针所指向的地址就是指针p 自己的地址。
*ptr=&b; //*ptr 是个指针,&b 的结果也是个指针,且这两个指针
//的类型和所指向的类型是一样的,所以用&b 来给*ptr 赋
//值就是毫无问题的了。
**ptr=34; //*ptr 的结果是ptr 所指向的东西,在这里是一个指针,
//对这个指针再做一次*运算,结果是一个int 类型的变量。