什么是数组到指针衰减?与数组指针有什么关系吗?
原文由 Vamsi 发布,翻译遵循 CC BY-SA 4.0 许可协议
试试这个代码
void f(double a[10]) {
printf("in function: %d", sizeof(a));
printf("pointer size: %d\n", sizeof(double *));
}
int main() {
double a[10];
printf("in main: %d", sizeof(a));
f(a);
}
你会看到函数内部数组的大小不等于main中数组的大小,而是等于指针的大小。
您可能听说过“数组是指针”,但这并不完全正确(在 sizeof
中的 main
打印正确的大小)。但是,当通过时,数组 衰减 为指针。也就是说,无论语法显示什么,您实际上都传递了一个指针,而函数实际上接收了一个指针。
在这种情况下,定义 void f(double a[10]
被编译器隐式转换为 void f(double *a)
。您可以等效地将函数参数直接声明为 *a
。您甚至可以编写 a[100]
或 a[1]
,而不是 a[10]
,因为它实际上从未以这种方式编译(但是,您显然不应该这样做,它会使读者感到困惑)。
原文由 blue_note 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答838 阅读✓ 已解决
1 回答2.2k 阅读
1 回答819 阅读✓ 已解决
2 回答1.1k 阅读
1 回答1.2k 阅读
1.2k 阅读
1 回答708 阅读
据说数组“衰减”成指针。声明为
int numbers [5]
的 C++ 数组不能重新指向,即不能说numbers = 0x5a5aff23
。更重要的是,衰减一词表示类型和维度的损失;numbers
int*
并且类型不再是int [5]
。在这里寻找 没有发生衰变的情况。如果您按值传递数组,那么您真正要做的是复制指针 - 指向数组第一个元素的指针被复制到参数(其类型也应该是数组元素类型的指针)。这是由于阵列的衰减性质而起作用的;一旦衰减,
sizeof
不再给出完整数组的大小,因为它本质上变成了一个指针。这就是为什么首选(以及其他原因)通过引用或指针传递的原因。传入数组1的三种方法:
最后两个将给出正确的
sizeof
信息,而第一个不会,因为数组参数已经衰减以分配给参数。1 常量 U 应该在编译时知道。