ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访 问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存 储区时是不安全的。这样容易导致指针越界。
它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针 的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
例一:
(1)int *ptr;
(2)char *ptr;
(3)int **ptr;
(4)int (*ptr)[3];
(5)int *(*ptr)[4];
如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和c ++的复杂类型声明>>。
指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
(1)int*ptr; //指针的类型是int*
(2)char*ptr; //指针的类型是char*
(3)int**ptr; //指针的类型是int**
(4)int(*ptr)[3]; //指针的类型是int(*)[3] ,指向一个(拥有三个整数的)数组的指针
(5)int*(*ptr)[4]; //指针的类型是int*(*)[4]
对指针所指向物的分析,现在再对指针这个复合类型的第二部分,指针所指向物的意义进行分析。上面我们已经得到了指针本身的类型,那么将指针本身的类型去掉“”号就可得到指针所指向物的类型,分别如下: a)、int 所指向物是一个整数。 b)、int 所指向物是一个指向整数的指针。 c)、int ()[3] ()为空,可以去掉,变为int [3],所指向物是一个拥有三个整数的数组。 d)、int ()() 第一个()为空,可以去掉,变为int (),所指向物是一个函数,这个函数的参数为空,返回值为整数。
在方法上,遵循一定的编码规则可能是最立竿见影的方法了,下面我来阐述一下与指针相关的编程规则: 1) 未使用的指针初始化为NULL 。 2) 在给指针分配空间前、分配后均应作判断。 3) 指针所指向的内容删除后也要清除指针本身。 要牢记指针是一个复合的数据结构这个本质,所以我们不论初始化和清除都要同时兼顾指针本身(上述规则1,3)和指针所指向的内容(上述规则2,3)这两个方面。
int a[2][10]; int (p)[10]; 以上介绍了如何声明一个指向二维数组的指针, 类似地, 对一个指向 n 维数组的指 针也可以用同样的方法来声明,如下: int (p)[x2][x3]……[xn];