指针离储存的就是内存的一块地址。指针的内容分为指针的类型,指针所指向的类型,指针的值,指针所指向的内存区。
1. 指针的类型
指的是指针本身所具有的类型,去掉字符就是了。
int *ptr; //指针的类型是int *
char *ptr; //指针的类型是char *
int **ptr; //指针的类型是 int **
int (*ptr)[3]; //指针的类型是 int(*)[3]
int *(*ptr)[4]; //指针的类型是 int *(*)[4]
2. 指针所指向的类型
指的是,去掉 *+指针名 后剩下的数据类型。就是指针指向内容的数据类型。
int *ptr; //指针所指向的类型是int
char *ptr; //指针所指向的的类型是char
int **ptr; //指针所指向的的类型是 int * 这是指向内容里还是一块指针,也就是2维数组
int (*ptr)[3]; //指针所指向的的类型是 int()[3]
int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]
3. 指针的值
这个就是所谓储存的地址了,一个指针里面存着4个字节(32)位数的数值。
4. 指针所指向的内存区
就是这个内存指向的地方。
运算符*和&。
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类型的变量。