在以下指向数组的指针中,
int x[5] = {1};
int (*a)[5] = &x;
如果我不使用 & 运算符并这样做,我会有什么影响和后果..
int x[5] = {1};
int (*a)[5] = x; //No & operator
任何人都可以用一些很好的例子来解释..
在以下指向数组的指针中,
int x[5] = {1};
int (*a)[5] = &x;
如果我不使用 & 运算符并这样做,我会有什么影响和后果..
int x[5] = {1};
int (*a)[5] = x; //No & operator
任何人都可以用一些很好的例子来解释..
那么,类型将是错误的。
在您的示例中,x
将评估为int *
,指向 的第一个元素的指针x
。&x
另一方面,计算结果为int (*)[5]
指向整个数组的指针。
在实践中很难想出一个错误的例子,因为数组从定义的第一个元素开始。但在语言层面上它仍然是错误的。指针不能被隐式转换,除了void *
. 因此,在您的第二个示例中,编译器实际上应该警告您(如果没有,请添加一些标志,例如gcc
使用-std=c11 -Wall -Wextra
- 或获得更好的编译器)。
如果您改为编写以下内容:
int x[5] = {1};
int (*a)[5] = (int (*)[5])x;
它会工作并且应该在没有警告的情况下编译。不过,这不是正确的方法。尽管在这种特定情况下,强制转换应该总是按预期工作,但您通常应该避免在 C 中强制转换指针。指针强制转换是一个潜在的错误,所以只有在绝对必要时才这样做,然后仔细检查生成的代码没有违反严格的别名(查找...)。
在这里,不需要演员表——写下来&x
,你就可以了。