我正在解决玩具问题以了解 C 中指针和数组之间的区别,我偶然发现了一些我还无法理解或找到答案的东西。
我有以下程序
#include <stdio.h>
int main()
{
int a[3][3] = {{1, 2, 3}, {4, 5,6}, {7, 8, 9}};
int (*b)[3];
b = a;
printf("%d %d %d\n", (*b)[0], (*b)[1], (*b)[2]);
printf("%d %d %d\n", *b[0], *b[1], *b[2]);
b++;
printf("%d %d %d\n", (*b)[0], (*b)[1], (*b)[2]);
b++;
printf("%d %d %d\n", (*b)[0], (*b)[1], (*b)[2]);
return 0;
}
当我编译并运行它时,我得到了这个:
me@mac: clang -g q.c -o q.o
me@mac: ./q.o
1 2 3
1 4 7
4 5 6
7 8 9
我的问题是 (*b)[0]
和 *b[0]
有什么区别?看起来前者是 int *
类型,而后者是 int *[3]
类型。如何解释运算符 *[]()
来理解这个?
最佳答案
int (*b)[3];
是一个数组指针,一种特殊的指针,可以指向整个数组而不仅仅是第一个元素.不要与 int *b[3]
混淆,后者是 3 个指针的数组,不存在于您的代码中。
b=a
将 b 设置为指向二维数组 a
中的第一个元素,这是一个一维数组。
当你解引用一个数组指针时,你得到了数组。当在表达式中使用数组时,它“衰减”为指向第一个元素的指针,这解释了第一行 printf。
如果你写*b[0]
,那么[]的运算符优先级高于*,所以它的意思是“给我数组编号0,它会衰减成指向第一个元素的指针,给我那个元素的内容”。
对于任何指针类型,包括数组指针,b
的指针递增遵循指针算法的规则:增加地址使得指针指向指向类型中的下一个相邻项内存。也就是说,将地址增加 sizeof(*b)
个字节,在本例中为 3*sizeof(int)
。
关于c - (*b)[0] 与 *b[0] - 数组和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34390643/