指针
指针是一个特殊的变量,它里面存储的数值被解释成为内存的一个地址。要理解一个指针需要弄清楚四方面的内容:
1.指针的类型 指针的例子:(1) int* ptr;
2.指针所指向的类型 (2) char* ptr;
3.指针的值或者叫指针所知想得内存区 (3) int** ptr;
4.指针本身所占据的内存区 (4) int (*ptr)[3];
(5) int* (*ptr)[4];
1.指针的类型
从语法角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。例如:
(1) int* ptr; //指针的类型是int*
(2) char* ptr; //指针的类型是char*
(3) int** ptr; //指针的类型是int**
(4) int (*ptr)[3]; //指针的类型是int (*)[3]
(5) int* (*ptr)[4] //指针的类型是int* (*)[4]
2.指针所指向的类型
当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器吧那片内存区里的内容当做什么来看待。
从语法上来看,只须把指针声明语句中的指针名和名字左边的指针声明符号*去掉,剩下的就是指针所指向的类型。
(1) int* ptr; //指针所指向的类型是int
(2)char* ptr; //指针所指向的类型是char
(3) int** ptr; //指针所指向的类型是int*
(4) int (*ptr)[3]; //指针所指向的类型是int ()[3] --> int [3]
(5) int* (*ptr)[4]; //指针所指向的类型是int* ()[4] --> int* [4]
在职真的算术运算中,指针所指向的类型有很大的作用。注意:指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。
3.指针的值----或者叫指针所指的内存区域地址
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始的,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说改指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说了改指针的值是这块内存区域的首地址。
4.指针本身所占据的内存区
指针本身占了多大的内存?只要用函数sizeof(指针的类型),测一下就知道了。在32位平台里面,指针本身占据了4个字节的长度。
(int* pInt = 0; 则&pInt就是指针pInt自身的地址,像其它变量一样,它也有自己的地址,而且此地址也可以放到另一个指针中去。)