C语言中指针类型参数声明时const的用法及语法疑问
C语言指针const修饰的那些事儿
1. 声明void f(int * const p)是否合法?
当然合法啦!这种写法完全符合C语言的语法规则,它是对指针本身做只读限制的一种写法,咱们后面详细说它的作用~
2. 四种声明的核心区别
要搞懂这些区别,关键看const在*的左边还是右边:const在*左边是限制指针指向的内容不能改;在*右边是限制指针本身的指向不能改。咱们一个个拆解:
- void f(const int *p) 和 void f(int const *p)
这俩其实是完全等价的,只是写法不同而已!
它们的核心是:const修饰的是int,也就是p指向的那个整数内容,你不能通过p去修改它的值。但指针p本身是可以变的——你可以让p指向另一个整数变量。举个例子:
int a = 10, b = 20; const int *p = &a; // *p = 30; ❌ 这行是非法的,不能通过p修改指向的内容 p = &b; ✅ 这行是合法的,p可以改指向
- void f(int * const p)
这里const在*的右边,修饰的是指针p本身。意思是:指针p的指向不能变(你不能让它指向别的变量),但它指向的那个整数内容是可以修改的。例子:
int a = 10, b = 20; int * const p = &a; *p = 30; ✅ 合法,可以修改指向的内容 // p = &b; ❌ 非法,p的指向不能改
- void f(const int * const p)
这是双重限制:const既在*左边又在右边,所以指针指向的内容不能改,同时指针本身的指向也不能改。相当于把上面两种限制结合起来了。例子:
int a = 10, b = 20; const int * const p = &a; // *p = 30; ❌ 非法,不能改内容 // p = &b; ❌ 非法,不能改指向
内容的提问来源于stack exchange,提问作者rrz0
相关产品推荐
相关产品推荐

