c语言中的int *const b 和 const int *b--常量指针与指向常量的指针的区别
指针本身的地址(门牌号)
指针变量和其他变量一样,在内存中占据一个位置,这个位置的地址是系统分配的,由编译器决定。
👉 比如你有一个变量 int a = 10,它的地址是 0x1000;而指针 int *b = &a 这个指针变量自己也有一个地址(比如 0x2000),但它存储的值是 0x1000(即指向 a)。
指针的“值”(指向的地址)
指针变量存储的值是一个内存地址(比如 0x1000),这个地址决定了它指向谁。
👉 当我们说“指针的地址固定”,实际上讨论的是指针存储的值(指向的地址)是否可变,而不是指针自己所在的地址。
回到问题:int *const b 和 const int *b 的区别
int *const b 是“指针常量”(常量指针),const 在 * 右侧,表示:
- 指针自己的地址(比如
0x2000)由系统分配,和普通变量一样,不可人为改变(但这是所有变量的共性,和const无关)。 - 指针存储的值(指向的地址,比如
0x1000)被const锁定,不可修改(b = &c会报错)。
const int *b 是“指向常量的指针”,const 在 * 左侧,表示:
- 指针存储的值(指向的地址)可以修改(
b = &c合法)。 - 但不能通过
b修改它指向的值(*b = 20会报错)。
比喻:信封和收信地址
想象指针变量 b 是一个信封:
- 信封自己的地址(比如“北京市海淀区A信箱”)是系统分配的,你无法改变这个信箱的位置。
- 信封里写的收信地址(比如“上海市浦东区B街道”)是
b存储的值,int *const b表示这个收信地址一旦写好就不能涂改(固定指向某个地址)。 const int *b则表示信封里的收信地址可以随时重写,但信封里的内容(指向的值)不允许修改(比如你只能读信,不能写信)。
总结表
| 类型 | 指针自己的地址(信封位置) | 指针存储的值(收信地址) | 指向的值(信的内容) |
|---|---|---|---|
int *const b |
由系统固定 | 🔒 不可变 | ✅ 可变 |
const int *b |
由系统固定 | ✅ 可变 | 🔒 不可变 |
关键结论:
- 所有变量(包括指针)的地址(自己的位置)由系统分配,程序运行时固定,与
const无关。 int *const b中的const固定的是指针存储的值(收信地址),而不是指针自己的地址。

浙公网安备 33010602011771号