c++指针:
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
当通过指针来访问指针所指向的内存区是,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待,
比如
int *ptr; 指向类型int
char *ptr;指向char
int *ptr; 指向int
int (*ptr)[3];指向int()【3】
int *(ptr)[4];指向int()【4】
指针的值是指针本身存储的数值,这个值被编译器当做一个地址,而不是一个一般的数值,在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为isizeof(指针所指向的类型)的一片内存区
所以指针的值是xx就代表指针指向了以xx为首地址的一片内存区域;
指针本身占据的内存:
用sizeof(指针的类型)函数,32位平台里,指针本身占据了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的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以?amp;b来给ptr赋值就是毫无问题的了。
**ptr=34;//ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次运算,结果就是一个int类型的变量。