C_pointer   

2. 指针使用注意事项

2.1 在指针的强制类型转换

ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访 问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存 储区时是不安全的。这样容易导致指针越界。

2.2 指针是一个特殊的变量

它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针 的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。

2.3 先声明几个指针

例一:

  (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 (),所指向物是一个函数,这个函数的参数为空,返回值为整数。

2.4 减少出错的根本是彻底理解指针。

  在方法上,遵循一定的编码规则可能是最立竿见影的方法了,下面我来阐述一下与指针相关的编程规则:   1) 未使用的指针初始化为NULL 。   2) 在给指针分配空间前、分配后均应作判断。   3) 指针所指向的内容删除后也要清除指针本身。   要牢记指针是一个复合的数据结构这个本质,所以我们不论初始化和清除都要同时兼顾指针本身(上述规则1,3)和指针所指向的内容(上述规则2,3)这两个方面。

2.5 声明数组指针

int a[2][10]; int (p)[10]; 以上介绍了如何声明一个指向二维数组的指针, 类似地, 对一个指向 n 维数组的指 针也可以用同样的方法来声明,如下: int (p)[x2][x3]……[xn];