含义
指针数组中的每一个元素均为指针,即有诸形如“ptr_array[i]”的指针。由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针。例如二维指针数组的定义为:char *ptr_array[][3]={{"asdx","qwer","fdsfaf"},
{"44444","555","6666"},
{"a78x","q3er","f2f"}};
二维数组中的元素亦可以表示为“*(*(ptr_array+i))”。又因为“()”的优先权较“*”高,且“*”是右结合的,因此可以写作**(ptr_array+i),表示第‘i+1’行的第一个元素。*(*(ptr_array+i)+j)表示第i+1行第j+1个元素。
运用
指针数组可以作为函式的参量使用,使用方式与普通数组类似。
指针数组常适用于指向若干字元串,这样使字元串处理更加灵活方便。
对比
与数组指针关係
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动); 指针数组是数组元素为指针的数组,其本质为数组。
例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针, []的优先权比*的优先权高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变数
与二维数组对比
二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字元。我们可以通过指定下标对其元素进行修改。
指针数组:如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分配的空间则不一定连续。
由此可见,相比于比二维字元数组,指针数组有明显的优点:一是指针数组中每个元素所指的字元串不必限制在相同的字元长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字元数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
举例
数组指针:
#includeintmain(){charc[][4]={哥,哥,我,岸,上,走};//UTF-8:一个汉字=3个位元组char(*p)[4];inti;p=c;//将指针定位于c[0]for(i=0;i<=5;i++){printf(%s,,*(p+i));//或者将*(p+i)替换成*p++}printf(\n);for(i=5;i>=0;i--){printf(%s,,*(p+i));//或者将*(p+i)替换成*--p}return0;}
指针数组:
#includeintmain(){inti; char*pch[6]={妹,妹,你,坐,船,头};for(i=0;i<6;i++){printf(%s,,pch[i]); } printf(\n); for(i=5;i>=0;i--){ printf(%s\n,pch[i]); }return0;}

















