这三条声明:
const char *p;
char const *p;
char * const p;
看起来很相似,但它们的含义完全不同。理解这些区别是掌握 C 语言指针与常量性(const 正确性)的关键。
✅ 一、const char *p;
🔍 含义:
p是一个指向 常量字符(char) 的指针。- 即:你不能通过
p修改它指向的内容,但你可以让p指向别的地方。
🧠 等价写法:
char const *p;
✅ 示例:
const char *p = "hello";
p = "world"; // ✅ OK:可以改变指针指向的位置
p[0] = 'H'; // ❌ 错误:不能修改指向的内容(字符串字面量是只读的)
📝 总结:
指向常量内容的指针
➤ 内容不可改,指针可变
✅ 二、char const *p;
🔍 含义:
- 和上面的
const char *p;完全等价! - 在 C 语言中,
const放在类型前或后都可以,只要不是紧挨着*,就表示修饰的是前面的类型。
✅ 示例:
char const *p = "hello";
p = "world"; // ✅ OK
p[0] = 'H'; // ❌ 错误
📝 总结:
和
const char *p完全一样 ➤ 指向常量内容的指针,指针本身可以变
✅ 三、char * const p;
🔍 含义:
p是一个 常量指针,指向的是char类型。- 即:指针本身不能变(不能指向其他地方),但它指向的内容是可以修改的。
✅ 示例:
char str[] = "hello";
char * const p = str;
p[0] = 'H'; // ✅ OK:可以修改内容
p = "world"; // ❌ 错误:不能让 p 指向其他地址
📝 总结:
常量指针(指针不能变)
➤ 指针指向不能变,内容可变
✅ 四、组合用法:const char * const p;
这个更高级一点:
🔍 含义:
p是一个常量指针,指向的是常量字符。- 即:既不能修改指针指向,也不能通过指针修改内容
✅ 示例:
const char * const p = "hello";
p[0] = 'H'; // ❌ 错误:内容不能改
p = "world"; // ❌ 错误:指针不能变
📝 总结:
常量指针指向常量内容 ➤ 都不能改!
✅ 总结对比表
| 声明 | 是否能修改指针指向 | 是否能修改指针指向的内容 |
|---|---|---|
const char *p; 或 char const *p; | ✅ 可以 | ❌ 不可以 |
char * const p; | ❌ 不可以 | ✅ 可以 |
const char * const p; | ❌ 不可以 | ❌ 不可以 |
✅ 小技巧记忆法
你可以这样来“读”这些声明(从右往左看):
| 声明 | 读法 | 含义 |
|---|---|---|
const char *p; | p 是一个指针,指向 char const | 内容是常量 |
char * const p; | p 是一个常量指针,指向 char | 指针是常量 |
const char * const p; | p 是常量指针,指向 char const | 都是常量 |
如果你有更复杂的指针声明,比如函数指针、多级指针加 const,也可以发出来,我可以帮你分析 😊