c++ - 什么是数组到指针的衰减?

标签 c++ c arrays pointers

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

最佳答案

据说数组会“衰变”成指针。声明为 intnumbers[5] 的 C++ 数组无法重新指向,即您不能说 numbers = 0x5a5aff23。更重要的是,衰变一词意味着类型和维度的损失; numbers 通过丢失维度信息(计数 5)而衰减为 int*,并且类型不再是 int [5]。在这里查找cases where the decay doesn't happen .

如果您按值传递数组,那么您真正要做的是复制指针 - 指向数组第一个元素的指针被复制到参数(其类型也应该是数组元素类型的指针)。这是由于数组的衰减特性而起作用的;一旦衰减,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 应在编译时已知。

关于c++ - 什么是数组到指针的衰减?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34703920/

相关文章:

c - 重新发送所有传入的数据包

c - 开关输入错误字符后如何重复菜单(再次要求用户输入)

c - 错误 : A label can only be part of a statement

c - 如何使用自定义类型进行 malloc()?

c - 确定存储指向其他不同维度数组的指针的数组的类型

c++ - 构建 C++ 项目的正确方法是什么?使/IDE/ Ant ...?

C++ - 动态加载行为

c++ - 通过具有多重继承的类向上转换 nullptr

c++ - 如何在 operator[] 的声明中将 decltype 应用于成员函数

c++ - 阵列程序奇怪的输出