c语言中的int *const b 和 const int *b--常量指针与指向常量的指针的区别

指针本身的地址(门牌号)

指针变量和其他变量一样,在内存中占据一个位置,这个位置的地址是系统分配的,由编译器决定。
👉 比如你有一个变量 int a = 10,它的地址是 0x1000;而指针 int *b = &a 这个指针变量自己也有一个地址(比如 0x2000),但它存储的值是 0x1000(即指向 a)。


指针的“值”(指向的地址)

指针变量存储的值是一个内存地址(比如 0x1000),这个地址决定了它指向谁。
👉 当我们说“指针的地址固定”,实际上讨论的是指针存储的值(指向的地址)是否可变,而不是指针自己所在的地址。


回到问题:int *const bconst 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 固定的是指针存储的值(收信地址),而不是指针自己的地址。
posted @ 2025-05-28 11:12  隐形的喷火龙  阅读(32)  评论(0)    收藏  举报