再谈指针数组和数组指针

来源:百度文库 编辑:神马文学网 时间:2024/04/18 11:56:36

指针数组:一个存放指针的数组,对于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<cout<

(二)
char (*p)[3];    //arrary pointer
cout<cout<         //表一个数组,故输出数组的元素个数为3,注意和例(三)的区别!

(三)
char x[3];
char *p=x;
cout<cout<

以上只是最简单的情况,再看稍微复杂点的:
(四)
 double*  (*a)[3][6];
 cout< cout< cout< cout< cout<分析: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< cout< cout< cout< cout<分析:这个例子,a被定义为一个二维数组,该数组中的每个元素是double**型的。其余分析计算同上。