指针数组与数组指针
时间:2018-03-09作者:华清远见
一、 指针数组 定义:指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。 Char *array[5] = {“welcome”,”to”,”wuhan”,”guanggu”,“now”}; //array就是我们定义的一个指针数组,它有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串。 我们可以写成: Char *(array[5])= {“welcome”,”to”,”wuhan”,”guanggu”,“now”};
这个指针数组的长度为20个字节,因为每个数组元素里存放的都是一个指针,指针的长度就是四个字节。
数组里面的每一个成员都保存着一个字符串的地址,每个字符串都存在内存的常量区。 一、 数组指针 定义:数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。 首先来定义一个数组指针,既然是指针,名字就叫pa char (*pa)[5];
如果指针数组和数组指针这俩个变量名称一样就会是这样:char *pa[5]和char (*pa)[5],原来指针数组和数组指针的形成的根本原因就是运算符的优先级问题,所以定义变量是一定要注意这个问题,否则定义变量会有根本性差别! pa是一个指针指向一个char [5]的数组,每个数组元素是一个char类型的变量,所以我们不妨可以写成:char[5] (*pa);这样就可以直观的看出pa的指向的类型,不过在编辑器中不要这么写,因为编译器根本不认识,这样写只是帮助我们理解。 既然pa是一个指针,存放一个数组的地址,那么在我们定义一个数组时,数组名称就是这个数组的首地址,那么这二者有什么区别和联系呢? char a[5]; a是一个长度为5的字符数组,a是这个数组的首元素首地址。既然a是地址,pa是指向数组的指针,那么能将a赋值给pa吗?答案是不行的!因为a是数组首元素首地址,pa存放的却是数组首地址,a是char 类型,a+1,a的值会实实在在的加1,而pa是char[5]类型的,pa+1,pa则会加5,虽然数组的首地址和首元素首地址的值相同,但是两者操作不同,所以类型不匹配不能直接赋值,但是可以这样:pa = &a,pa相当与二维数组的行指针,现在它指向a[5]的地址。 这里有个有意思的话题值得探讨一下:平时我们定义指针不都 是在数据类型后面加上指针变量名么?这个指针pa 的定义怎么不是按照这个语法来定义的呢?也许我们应该这样来定义pa: int (*)[5] pa; int (*)[5]是指针类型,pa 是指针变量。这样看起来的确不错,不过就是样子有些别扭。其实数组指针的原型确实就是这样子的,只不过为了方便与好看把指针变量pa 前移了而已。你私下完全可以这么理解这点。虽然编译器不这么想。 相关资讯
发表评论
|