C++面试题更新 2026-08-05

在 C++ 语言里,数组名与指针变量之间存在哪些本质区别?请从类型、内存布局、运算操作及作为函数参数传递时的行为等角度进行说明。

技术原理C++

考察说明

考查对 C++ 中数组与指针核心概念及其差异的理解。

回答思路

  1. 【回答框架 1】数组名是常量,指针是变量;数组名代表数组首元素地址且不可重新赋值,指针可以指向其他对象。数组名隐式转换为指向首元素的指针,但转换后丢失数组大小信息。
  2. 【回答框架 2】sizeof 操作符:对数组名取 sizeof 得到整个数组占用的字节数;对指针取 sizeof 得到指针本身大小(如 8 字节 64 位系统)。数组名在表达式中通常退化为指针,但作为 sizeof 或 & 操作数时不退化。
  3. 【回答框架 3】数组与指针在访问元素时语法相似(a[i] 等价于 *(a+i)),但底层含义不同:数组是连续内存块,指针是保存地址的变量。多维数组的数组名指向其首元素(第一个子数组),类型为指向数组的指针。
  4. 【回答框架 4】函数参数传递时,数组声明会调整为指针(如 int a[] 退化为 int* a),导致数组大小丢失;所以需要显式传递长度或使用引用、std::array、std::vector 等保留大小信息。指针可以做算术运算(如 ++、--)而数组名不可以。
  5. 【回答框架 5】数组名不可变,不具备动态分配能力;指针可以通过 new 或 malloc 动态指向堆内存,但需注意生命周期与释放。现代 C++ 中推荐用容器或 std::span 替代裸指针和数组。
  6. 【关键点 1】数组名是常量,指针是变量,数组名不可重新赋值。
  7. 【关键点 2】sizeof(数组名) 得数组总字节数,sizeof(指针) 得指针大小。
  8. 【关键点 3】函数参数中数组退化为指针,丢失长度信息。
  9. 【关键点 4】数组名取地址类型为指向数组的指针,与指向首元素的指针不同。
  10. 【关键点 5】指针可做算术运算和动态分配,数组名不能。