C语言面试题更新 2026-08-03

在 C 语言里,数组指针与指针数组这两个概念各自指什么?它们在声明语法和实际用途上有何不同?

考察说明

考查对 C 语言中指针与数组结合时声明含义和用法的辨析能力。

回答思路

  1. 【回答框架 1】数组指针本质上是一个指针,它指向一个数组。例如 int (*p)[5] 中,p 是一个指针,指向含有 5 个 int 元素的数组,通常用于二维数组的行操作,p+1 会跳过整个数组。
  2. 【回答框架 2】指针数组本质上是一个数组,数组的每个元素都是指针。例如 int *arr[5] 中,arr 是一个数组,包含 5 个 int* 类型元素,常用于存储字符串或作为二维字符数组的替代。
  3. 【回答框架 3】区别的关键在于运算符优先级:[] 优先级高于 *,所以 int *arr[5] 先构成数组,每个元素是 int*;而 int (*p)[5] 中括号改变优先级,使 p 先与 * 结合成指针,再指向数组。
  4. 【回答框架 4】从内存布局看,指针数组占用数组空间存放多个指针,而数组指针只占用一个指针大小,指向的数组是另一块内存。
  5. 【回答框架 5】使用时,数组指针常用于函数参数传递二维数组,指针数组常用于字符串集合管理,如 char *argv[]。
  6. 【关键点 1】数组指针是指向数组的指针,声明为 int (*p)[N],p+1 移动 N 个元素。
  7. 【关键点 2】指针数组是元素为指针的数组,声明为 int *arr[N],每个元素可指向不同对象。
  8. 【关键点 3】运算符优先级决定声明含义:[] 优先级高于 *,括号改变结合方式。
  9. 【关键点 4】数组指针适用于多维数组操作,指针数组适合管理多个字符串或指针列表。
  10. 【易错点 1】混淆声明语法,把 int (*p)[5] 写成 int *p[5],导致类型完全不同。
  11. 【易错点 2】对数组指针解引用时,需注意获取的是数组首地址,而不是元素值,通常需要二次解引用或使用下标。
  12. 【易错点 3】使用指针数组时忽略数组越界,因为指针本身不检查边界,容易访问非法内存。