What is array to pointer decay?(什么是数组到指针衰减?)
问题描述
什么是数组到指针衰减?和数组指针有关系吗?
What is array to pointer decay? Is there any relation to array pointers?
推荐答案
据说数组衰减"成指针.声明为 int numbers [5]
的 C++ 数组不能重新指向,即不能说 numbers = 0x5a5aff23
.更重要的是,衰减一词表示类型和维度的损失;numbers
通过丢失维度信息(计数 5)衰减为 int*
并且类型不再是 int [5]
.在此处查找没有发生衰减的情况.
It's said that arrays "decay" into pointers. A C++ array declared as int numbers [5]
cannot be re-pointed, i.e. you can't say numbers = 0x5a5aff23
. More importantly the term decay signifies loss of type and dimension; numbers
decay into int*
by losing the dimension information (count 5) and the type is not int [5]
any more. Look here for cases where the decay doesn't happen.
如果你通过值传递一个数组,你真正要做的是复制一个指针——指向数组第一个元素的指针被复制到参数(其类型也应该是数组元素类型的指针).这是由于阵列的衰减性质而起作用的;一旦衰减,sizeof
不再给出完整数组的大小,因为它本质上变成了一个指针.这就是为什么首选(以及其他原因)通过引用或指针传递的原因.
If you're passing an array by value, what you're really doing is copying a pointer - a pointer to the array's first element is copied to the parameter (whose type should also be a pointer the array element's type). This works due to array's decaying nature; once decayed, sizeof
no longer gives the complete array's size, because it essentially becomes a pointer. This is why it's preferred (among other reasons) to pass by reference or pointer.
传入数组的三种方式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
信息,而第一个不会,因为数组参数已衰减以分配给参数.
The last two will give proper sizeof
info, while the first one won't since the array argument has decayed to be assigned to the parameter.
1 常量 U 应该在编译时知道.
这篇关于什么是数组到指针衰减?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:什么是数组到指针衰减?
基础教程推荐
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++,'if' 表达式中的变量声明 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01