版权归原作者所有,如有侵权,请联系我们

[科普中国]-指针数组

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

在C语言和C++语言中,数组元素全为指针的数组称为指针数组。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。例如,一个一维指针数组的定义:int *ptr_array[10]。

含义指针数组,顾名思义,就是说它首先是一个数组,而数组的元素是指针,也就是说,如果数组元素都是相同类型的指针,则称这个数组为指针数组。所谓相同类型的指针是说指针所指向的对象类型是相同的。一维指针数组的定义形式为:

指针数组中的每一个元素均为指针,即有诸形如“ptr_array[i]”的指针。由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针。

例如二维指针数组的定义为:char *ptr_array[3]={{"asdx","qwer","fdsfaf"},{"44444","555","6666"},{"a78x","q3er","f2f"}};1

指针数组不同于数组指针,指向数组的一个指针指向一维数组的指针,变量的定义形式:

数据类型(‘变量名)[元素个数];2

运用指针数组可以作为函数的参量使用,使用方式与普通数组类似。

指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。3

对比与数组指针关系数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动); 指针数组是数组元素为指针的数组,其本质为数组。4

例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针, []的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量

与二维数组对比二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。2

指针数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。如果我做这样的定义:

char a[3][8]={"gain","much","strong"};

char *n[3]={"gain","much","strong"};

他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了

3×8的空间,而给n分配的空间则取决于具体字符串的长度。

此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。

举例数组指针:

#includeint main(){ char c[][4] = {"哥", "哥", "我", "岸", "上", "走"}; //UTF-8:一个汉字=3个字节 char (*p)[4]; int i; p=c; //将指针定位于c[0] for(i=0;i=0;i--) { printf("%s,",*(p+i)); //或者将*(p+i)替换成*--p } return 0;}指针数组:

#includeint main(){ int i; char *pch[6] = {"妹","妹","你","坐","船","头"}; for(i=0;i=0; i--){ printf("%s\n",pch[i]); } return 0;}本词条内容贡献者为:

徐恒山 - 讲师 - 西北农林科技大学