指针数组与数组指针

来源:互联网 发布:淘宝美工排版 编辑:程序博客网 时间:2024/06/10 23:02

指针数组:一个存放指针的数组,对于32位的系统,其中的每个元素都是一个4字节的指针,譬如:char *p[3],它声明了一个p的指向三个char*类型的数组的指针,该数组中每个类型都是char*指针。

数组指针:指向某种类型数组的指针,例如:char (*p)[3]声明了了一个p的指向三个char元素数组的指针,数组中每个元素都是一个char型数据。

可以看两个简单的例子,先理解一下(假定为32位OS,编译环境VC++6.0):
(一)
char *p[3];  //pointer array
cout<<sizeof(p)<<endl;     //指针4字节,p本质是一个三元素的数组,所以输出4*3=12
cout<<sizeof(*p+1)<<endl;   // *p为指针数组的第一个元素,该元素是指针型,故输出4

(二)
char (*p)[3];    //arrary pointer
cout<<sizeof(p)<<endl;   //p本身本质为一个指针而非数组,所以输出为4
cout<<sizeof(*p)<<endl;  //虽然p是指针,但是由定义式(*p)编译时被看作一个数组定义,所以(*p)代
         //表一个数组,故输出数组的元素个数为3,
注意和例(三)的区别!

(三)
char x[3];
char *p=x;
cout<<sizeof(p)<<endl;   //毫无疑问,输出4 
cout<<sizeof(*p)<<endl;  //p只是一个担任和数组名同功能的指针角色,(*p)也是指针引用方式,而不会被(二)中那样被解析为数组调用,所以,输出为p所引用的char类型的字节数,即输出为1

以上只是最简单的情况,再看稍微复杂点的:
(四)
 double*  (*a)[3][6];
 cout<<sizeof(a)<<endl;  // 4
 cout<<sizeof(*a)<<endl;  // 72
 cout<<sizeof(**a)<<endl; // 24
 cout<<sizeof(***a)<<endl; // 4
 cout<<sizeof(****a)<<endl; // 8
分析:a的定义是比较奇怪的,首先(*a)[3][6]表示一个二维数组指针,而且该数组是一个3*6的指针数组,数组中的每个元素为double*型。理清这点就好分析了。a本质是个指针,所以输出4,(*a)本质代表一个数组,所以它计算的是这个二维数组的size字节,故输出为3*6*(4字节)=72,(**a)可看作(*(*a)),它表示这个二维数组的行数组,一行有6个元素,所以=4*6=24,(***a)可看作(*(*(*a))),表示行数组的第一个元素,其类型为double*,所以输出4,最后一个(****a)则表示行数组第一个元素的指向数值的类型,为double型,故输出为double的字节数8。

(五)
 double** a[3][6];
 cout<<sizeof(a)<<endl;  // 3*6*4字节=72
 cout<<sizeof(*a)<<endl;  // 6*4字节=24
 cout<<sizeof(**a)<<endl; // 4
 cout<<sizeof(***a)<<endl; // 4
 cout<<sizeof(****a)<<endl; // 8
分析:这个例子,a被定义为一个二维数组,该数组中的每个元素是double**型的。其余分析计算同上。

原创粉丝点击