数组退化为指针的完整规则
C++中数组名在什么情况下会退化为指向首元素的指针?什么情况下不会退化?数组名作为函数参数、sizeof操作数、&操作数时行为有何不同?
回答
孤独的心
数组退指针(C array-to-pointer decay):除以下三种情况外,数组名退化为指向首元素的指针:
不退化的三种情况:
- 作为sizeof的操作数:
sizeof(arr)返回整个数组的字节数 - 作为&的操作数:
&arr得到指向整个数组的指针(T(*)[N]类型) - 作为字符串字面量初始化字符数组:
char arr[] = "hello";
退化的场景:
- 函数参数传递:
void f(int arr[])等价于void f(int* arr) - 传递给模板函数:类型推导为指针而非数组
- 赋值给指针:
int* p = arr; - 作为函数返回值:不能直接返回数组,只能返回指针
退化结果:int arr[5]→退化后类型为int*,丢失数组长度信息。如需保留数组信息,传引用:void f(int (&arr)[5])。C++17的std::span和C++20的std::ranges提供更安全的方式传递数组视图。