基本概念:
指针是存储了一个内存中的变量,主要需要理清楚四个方面的内容:
1、指针的本身类型
2、指针指向区域的内容(指针指向的区域会被解析成为特定的类型)
3、指针指向的内容区
4、指针本身所占的内容区
1、指针的本身类型
来,首先第一点,指针本身的类型,这个问题比较费解的地方在于,指针只是一串内存的地址而已,本身的类型的意义在哪儿? 简单来说,其实和使用变量的时候需要申明类型一样,因为指针同变量一样需要进行一些变量的运算,在运算的过程中就会涉及到不同的类型,举个栗子:
int *ptr = a[10];
ptr=ptr+1;
我们熟悉的这个栗子中,ptr++的操作实现了指向数组的下一个值(a[1]),其实在编译器中,ptr实际上是加上了sizeof(int)的值,也就是加上了4个字节,即ptr在原来的地址上向高位地址移动了四个字节。
下面是分辨指针类型的方法:
int *ptr; //指针的类型是int *
char *ptr; //指针的类型是char *
int **ptr; //指针的类型是 int **
int (*ptr)[3]; //指针的类型是 int(*)[3],即int的指针数组类型
int *(*ptr)[4]; //指针的类型是 int *(*)[4] ,即指向 int的指针数组 的指针
就是把变量名去掉,这么简单啦啦啦啦啦
2、指针指向的数据类型
int *ptr; //指针所指向的类型是int
char *ptr; //指针所指向的的类型是char
int **ptr; //指针所指向的的类型是 int *
int (*ptr)[3]; //指针所指向的的类型是 int()[3]
int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]
简单的说就是去掉变量和变量左边的* 指针符号
3、指针本身所占据的内存
在32位平台里,指针本身占据了4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
4、运算符&和*
&:取地址运算符
* 间接运算符
&a的意思很好理解,就是a的存储内容的地址,即&a就是一个指针
*p的运算结果就五花八门了。总之*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的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以?amp;b来给*ptr赋值就是毫无问题的了。
**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。