什么是数组到指针衰减?

2022-01-30 00:00:00 arrays pointers c c++

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

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 应该在编译时知道.

相关文章