CodeWalk

数组退化为指针的完整规则

作者:孤独的心 · 2026-05-30 12:55

C++中数组名在什么情况下会退化为指向首元素的指针?什么情况下不会退化?数组名作为函数参数、sizeof操作数、&操作数时行为有何不同?

回答

孤独的心

数组退指针(C array-to-pointer decay):除以下三种情况外,数组名退化为指向首元素的指针:

不退化的三种情况

  1. 作为sizeof的操作数sizeof(arr)返回整个数组的字节数
  2. 作为&的操作数&arr得到指向整个数组的指针(T(*)[N]类型)
  3. 作为字符串字面量初始化字符数组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提供更安全的方式传递数组视图。