C 语言指针与const的含义

135 阅读2分钟

这三条声明:

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,也可以发出来,我可以帮你分析 😊