什么是数组到指针衰减?

新手上路,请多包涵

什么是数组到指针衰减?与数组指针有什么关系吗?

原文由 Vamsi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 924
2 个回答

据说数组“衰减”成指针。声明为 int numbers [5] 的 C++ 数组不能重新指向,即不能说 numbers = 0x5a5aff23 。更重要的是,衰减一词表示类型和维度的损失; numbers int* 并且类型不再是 int [5] 。在这里寻找 没有发生衰变的情况

如果您按值传递数组,那么您真正要做的是复制指针 - 指向数组第一个元素的指针被复制到参数(其类型也应该是数组元素类型的指针)。这是由于阵列的衰减性质而起作用的;一旦衰减, sizeof 不再给出完整数组的大小,因为它本质上变成了一个指针。这就是为什么首选(以及其他原因)通过引用或指针传递的原因。

传入数组1的三种方法:

 void by_value(const T* array)   // const T array[] means the same
void by_pointer(const T (*array)[U])
void by_reference(const T (&array)[U])

最后两个将给出正确的 sizeof 信息,而第一个不会,因为数组参数已经衰减以分配给参数。

1 常量 U 应该在编译时知道。

原文由 phoebus 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题