修改
我在这里阅读了问题和答案: C pointer to array/array of pointers disambiguation 。那里的答案并没有解决我的问题的重点以及下面已经发布的一些答案。这是类似,但不是重复。这里的重点旨在集中解释()
如何更改声明。链接中的重点更广泛,实际上并不围绕()
对声明的影响和影响,例如我在下面列出的声明。
方式差异的原因是什么?
int *a[5];
int (*a)[5];
是否已创建?
我对()
如何更改声明的解释特别感兴趣。
例如:
1)
a[0] = malloc(sizeof(int)); //compiles
但是2)它没有。 (错误:数组类型int [5]不可分配)
的 问题:
1)()
中2)
的影响是什么?
2)为什么宣言2
会被用于宣言1?
(也就是说,为什么会使用声明2
?)
答案 0 :(得分:5)
它们不一样,而且非常不同。
int *a[5];
是一个包含5个int *
s的数组。
int (*a)[5];
是一个指向5 int
s数组的指针。
因此,在前一种情况下,a[0]
是指针变量,因此,您可以分配。但是在后面,a[0]
是一种数组类型,根据定义,它是不可分配的。
编辑:
如果您因()
的存在而对类型的差异感兴趣,请查看operator precedence。 []
的优先级高于*
,因此如果没有明确的()
,a
的附件会首先转到[]
。
答案 1 :(得分:4)
在int (*a)[5];
中,()
将*
绑定到a
,并将其声明为指向数组的指针。在int *a[5];
中,a
由于优先级高于[]
而绑定到运算符*
,因此将其声明为指针数组。
因此,在第二种情况下,a
是指向数组的指针,而a[0]
是一个数组(类型为int [5]
),并且根据C规则,数组不可分配。这是声明
a[0] = malloc(sizeof(int));
非法的。
答案 2 :(得分:2)
因为1
是指针数组,而2是指向5 int
数组的指针。像这样检查
int (*a)[5];
int *b[5];
fprintf(stderr, "%zu\n", sizeof(a)); // Prints sizeof(void *)
fprintf(stderr, "%zu\n", sizeof(b)); // Prints 5 * sizeof(void *)
答案 3 :(得分:2)
此
int *a[5];
是类型int *
的5个指针数组的声明。
所以a[0]
是int *
类型的对象,你可以用一个类型为`void * in C
a[0] = malloc(sizeof(int)); //compiles
This`
int (*a)[5];
是指向int[5]
类型对象的指针的声明。因此a[0]
是一个包含int
类型的5个元素的数组。您可能无法为指针分配数组
因此这句话
a[0] = malloc(sizeof(int));
无效。