| 类型 | 核心内容 | 关键特性 | 易混淆点 |
|---|---|---|---|
| 指针常量 | int* const p = &a 指针本身是常量,内存地址固定不可修改,可以修改指向的值 |
1. const 修饰指针变量 p 2. p 不能再指向别的变量(p=&b报错) 3. *p 可以修改(*p=100合法) |
const 写在 * 后面,限制的是指针本身;容易和常量指针写反,分不清谁被 const 保护 |
| 常量指针 | const int* p = &b 指针可修改指向地址,不能通过指针修改指向的值 |
1. const 修饰 *p(指向的数据) 2. p 可以指向别的变量(p=&a合法) 3. *p 不能修改(*p=100报错) |
const 写在 * 前面,保护的是指针指向的数据;⚠️ 只是不能通过指针改值,原变量 b 本身如果不是 const,b 可以直接修改 |
一句话口诀
const 离谁近,谁就不能改
● int* const p → const 靠近 p → p 不能改(地址固定,指针常量)
● const int* p → const 靠近 int(*p) → *p 不能改(常量指针)
拓展:const int *const p;
既不能改指针地址,也不能通过指针修改内容,常量指针 + 指针常量
c
#include <stdio.h>
int main(void)
{
int a = 10, b = 20;
// 指针常量:p地址固定,*p可改
int* const p = &a;
*p = 100; // ✅合法,修改指向的值
// p = &b; // ❌报错,不能修改指针地址
// 常量指针:p可以换指向,*p不可改
const int* q = &b;
q = &a; // ✅合法,修改指针指向
// *q = 200; // ❌报错,不能通过指针修改内容
return 0;
}