指针数组

C语言C++语言中,数组元素全为指针的数组称为指针数组。

一维指针数组的定义形式为:类型名 *数组标识符[数组长度]”

例如,一个一维指针数组的定义:int *ptr_array[10]

含义

指针数组中的每一个元素均为指针,即有诸形如“*ptr_array[i]”的指针。

指针数组中的元素亦可以表示为“*(*ptr_array+i))”。又因为“()”的优先级较“*”高,且“*”是右结合的,因此可以写作**ptr_array+i)。

由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针。

运用

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

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

数组指针

数组名的指针,即数组首元素地址的指针。即是指向数组的指针。

例:int (*p)[10]; p即为指向数组的指针,又称数组指针。

 

数组指针与指针数组

数组指针是指向数组地址的指针,其本质为指针;spacer.gif

指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。

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

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

 

数组指针的使用在某些情况下与指针数组很相似,要注意区别。

 

二维数组指针

为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。

例如:

{

int a[4][5];

int (*p)[5]=a;

}

这里a是个二维数组的数组名,相当于一个二级指针常量;

p是一个指针变量,它指向包含5int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位; 

*(p+i)是二维数组a[i][0]的地址;

*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),**(p+2)+3)表示a[2][3]的值。

//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译

(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。

 

与二维数组对比 

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

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

spacer.gif

如果我做这样的定义:

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

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

他们在内存的存储方式

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

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

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