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