数组名不是指针,而是数组类型,具有固定长度和类型信息;它在多数表达式中会退化为指向首元素的指针,但本身不可修改,sizeof 返回整个数组大小,而指针则返回地址大小。

数组名本身就是指针?别被误导了
数组名在多数表达式中会“退化”为指向首元素的指针,但它本身不是指针类型——它是数组类型,有固定长度和类型信息。sizeof 就能戳破这个幻觉:sizeof(arr) 返回整个数组字节数,而 sizeof(ptr) 只返回指针大小(通常 8 字节)。真要获得指针,得显式取地址或强制转换。
用 &arr[0] 或 arr 获取指向首元素的指针
这是最常用、最安全的方式,适用于所有内置数组和 std::array:
-
&arr[0]明确表示“取第一个元素的地址”,类型是T* -
arr在需要指针的上下文(如函数参数)中自动退化为T*,等价于&arr[0] - 两者都指向首元素,但
arr不能对它做++或+=操作(除非先赋给变量),因为数组名是右值
示例:
<pre class="brush:php;toolbar:false;">int arr[5] = {1,2,3,4,5};<br>int* p1 = &arr[0]; // ✅ 显式、清晰<br>int* p2 = arr; // ✅ 合法,但依赖隐式转换<br>p1++; // OK<br>arr++; // ❌ 编译错误:数组名不可修改
std::array 怎么转指针?别直接用 data()
std::array 提供 <code>data() 成员函数,返回 T*,这才是标准且安全的做法:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
-
std::array<int> a = {1,2,3}; int* p = a.data();</int>—— 正确 -
int* p = &a[0];也行,但不如data()语义明确 -
int* p = a;❌ 编译失败:std::array 不支持隐式转指针 - 注意:
a.data()返回的指针仅在a生命周期内有效;若传给异步回调或长期存储,必须确保对象不被销毁
char 数组转 const char* 时小心隐式转换陷阱
字符串字面量(如 "hello")类型是 const char[6],退化成 const char*;但普通 char arr[] 转 const char* 会触发隐式转换,容易掩盖 const 正确性问题:
-
char buf[10] = "abc"; const char* s = buf;—— 合法,但s指向可修改内存,却声明为 const,可能误导后续逻辑 - 更安全写法:
const char* s = static_cast<const char>(buf);</const>或直接用std::string_view(buf) - 如果函数参数是
const char*,传入buf没问题;但若函数内部试图通过该指针修改内容,就是未定义行为
真正容易出错的是把局部 char[] 的指针返回给调用方——栈内存一退出作用域就失效,这类悬垂指针很难 debug。

















