本帖最后由 风过无痕1989 于 2020-12-14 16:20 编辑
对指针数组和数组指针的区别,示例代码如下所示:
int *array[5]; // 定义一个指针数组
int (*arr)[5]; // 定义一个数组指针
首先,对于语句“int *array[5]”,因为“[]”的优先级要比“*”要高,所以 array 先与“[]”结合,构成一个数组的定义,数组名为 array,而“int *”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,它是一个指针数组。
其次,对于语句“int(*arr)[5]”,“()”的优先级比“[]”高,“*”号和 arr 构成一个指针的定义,指针变量名为 arr,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,arr 是一个指针,它指向一个包含 5 个 int 类型数据的数组,很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。
比较下面的例子,此例子与求助的程序输出结果完全相同,只是求助的程序,定义的是一个指针数组,而下面的程序定义的是一个数组指针,故而,求助的例子会多一个 * 号
#include <stdio.h>
int main()
{
char array[5][6] = { "FishC", "Five", "Star", "Good", "WoW" };
char (*p)[6] = array;
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; *(*(p + i) + j) != '\0'; j++)
{
printf("%c ", *(*(p + i) + j));
}
printf("\n");
}
return 0;
}
为了方便比较,我还是将上面的例子移下来:#include <stdio.h>
int main()
{
char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
char *(*p)[5] = &array;
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; *(*(*p + i) + j) != '\0'; j++)
{
printf("%c ", *(*(*p + i) + j));
}
printf("\n");
}
return 0;
}
|