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

在 C 语言里,const 关键字与指针结合使用时,根据 const 和星号的位置关系会产生几种不同的声明形式,它们的约束对象分别是什么?请列举出这些情况并说明各自含义。

考察说明

考查对 const 与指针组合时的声明解析能力,理解 const 修饰的是指针本身还是所指向的数据。

回答思路

  1. 【回答框架 1】const 修饰指针时,只看 const 与星号的相对位置:如果 const 在星号左边,如 const int *p 或 int const *p,那么 const 修饰的是指针指向的对象,即 *p 不能通过 p 修改,但 p 可以指向其他地址,这种写法两者等价。
  2. 【回答框架 2】如果 const 在星号右边,如 int *const p,那么 const 修饰的是指针变量本身,即 p 不能重新赋值指向其他地址,但可以通过 p 修改所指向对象的值。
  3. 【回答框架 3】如果星号两边都有 const,即 const int *const p 或 int const *const p,则指针变量和它指向的对象都不能被修改,p 不能改指,*p 也不能通过 p 改值。
  4. 【回答框架 4】解析时最实用的口诀是:先看 const 和星号的位置,const 在星号左边时修饰指向的对象,在星号右边时修饰指针本身。
  5. 【回答框架 5】声明从变量名开始向左看,遇到星号表示指针,遇到 const 就作用于最近的那个实体,这样能快速确定 const 的约束范围。
  6. 【关键点 1】const int *p 与 int const *p 等价,均表示指向常量的指针,指针可变,所指对象不可通过 p 修改。
  7. 【关键点 2】int *const p 表示常量指针,指针本身不可变,但所指对象可修改。
  8. 【关键点 3】const int *const p 表示指针和所指对象都不可修改。
  9. 【关键点 4】const 在星号左侧修饰所指对象,在星号右侧修饰指针本身。
  10. 【易错点 1】不能混淆 const int *p 与 int *const p,前者指针可变,后者指针不可变。
  11. 【易错点 2】const int *p 并不代表指向的对象一定是常量,只是不能通过 p 去修改,若对象本身非 const,仍可通过其他指针修改。
  12. 【易错点 3】const int *const p 与 int const *const p 完全等价,不要误认为含义不同。