2

在以下指向数组的指针中,

int x[5] = {1};
int (*a)[5] = &x;

如果我不使用 & 运算符并这样做,我会有什么影响和后果..

int x[5] = {1};
int (*a)[5] = x; //No & operator

任何人都可以用一些很好的例子来解释..

4

1 回答 1

4

那么,类型将是错误的。

在您的示例中,x将评估为int *,指向 的第一个元素的指针x&x另一方面,计算结果为int (*)[5]指向整个数组的指针。

在实践中很难想出一个错误的例子,因为数组从定义的第一个元素开始。但在语言层面上它仍然是错误的。指针不能被隐式转换,除了void *. 因此,在您的第二个示例中,编译器实际上应该警告您(如果没有,请添加一些标志,例如gcc使用-std=c11 -Wall -Wextra- 或获得更好的编译器)。

如果您改为编写以下内容:

int x[5] = {1};
int (*a)[5] = (int (*)[5])x;

它会工作并且应该在没有警告的情况下编译。不过,这不是正确的方法。尽管在这种特定情况下,强制转换应该总是按预期工作,但您通常应该避免在 C 中强制转换指针。指针强制转换是一个潜在的错误,所以只有在绝对必要时才这样做,然后仔细检查生成的代码没有违反严格的别名(查找...)。

在这里,不需要演员表——写下来&x,你就可以了。

于 2018-04-29T18:59:22.537 回答