数组指针和指针数组是两个容易搞混的概念,接下去我们对它们进行一个详细的分析。
首先,理解一下数组指针和指针数组这两个名词:
- 数组指针:数组的指针,是一个指针,指向数组的指针。
- 指针数组:指针的数组,是一个数组,装着指针的数组。
然后,先明确一个优先级顺序:()>[]>* ,所以:
- 数组指针(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”。
- 指针数组* p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”。
以下面两个示例进行进一步分析
int *p1[5];
int (*p2)[5];
- int *p1[5] :因为 [] 的优先级高于 * ,所以p1先与 [] 结合,构成一个数组的定义,数组名为p1,而 “int *”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含5个指向int类型数组的指针,如下图一所示,它是一个指针数组。 图一 指针数组
-
int (* p2)[5]:()的优先级高于 [ ] ,“ * ”和p2构成一个指针的定义,指针变量名为p2,而int 修饰的是数组的内容,即数组的每个元素。也就是说,p2是一个指针,它指向一个包含5个int类型数据的数组,如图二所示,它是一个数组指针。PS:数组指针也称一维数组的指针,所以数组指针也称行指针,即使用过程中,需要将二维数组的行地址赋给这个指针使用。
图二 数组指针
由此可见:
- 对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;
- 对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在32位系统下永远占4个字节,至于它指向的数组占多少字节,这个是不能确定的,要看具体情况。
下面展示两个实际例子:
#include<stdio.h>
int main()
{
char a[3][20] = { "aaa","bbb","ccc" };
char(*p)[20]; //数组指针
p = a; // 等于 p=&a[0] 即把二维数组a的 第0行首地址赋给p
for (int i = 0; i < 3; i++)
{
printf("%s\n", p++);
}
char* p[3] = { "aaa","bbb","ccc" }; //指针数组
for (int i = 0; i < 3; i++)
{
printf("%s\n", p[i]);
}
return 0;
}
网友评论