判断 const
修饰的是指针还是内容
1. const char *p
和 char const *p
这两种声明是等价的,表示指针指向的内容是常量。通过分析 const
关键字的位置,可以确定 const
修饰的是指针指向的内容。
const char *p
:const
修饰的是char
,即p
指向的内容。char const *p
:const
修饰的是char
,即p
指向的内容。
示例代码:
#include <stdio.h>
int main() {
const char *p1 = "Hello"; // 等价于 char const *p1
char const *p2 = "World";
// 不能通过指针 p1 和 p2 修改指向的内容
// *p1 = 'h'; // 错误:不能修改 p1 指向内容的值
// *p2 = 'w'; // 错误:不能修改 p2 指向内容的值
// 可以改变指针 p1 和 p2 本身的值
p1 = "New Hello";
p2 = "New World";
printf("p1: %s\n", p1);
printf("p2: %s\n", p2);
return 0;
}
// 输出结果:
// p1: New Hello
// p2: New World
2. char *const p
表示指针本身是常量,不能改变指针的值,但可以通过指针修改指向的内容。通过 const
关键字的位置,可以确定 const
修饰的是指针本身。
char *const p
:const
修饰的是指针p
本身。
示例代码:
#include <stdio.h>
int main() {
char str[] = "Hello";
char *const p = str;
// 可以通过指针 p 修改指向的内容
*p = 'h';
// 不能改变指针 p 本身的值
// p = "New Hello"; // 错误:不能改变指针 p 本身
printf("p: %s\n", p);
return 0;
}
// 输出结果:
// p: hello
3. const char *const p
表示指针本身和指针指向的内容都是常量。通过 const
关键字的位置,可以确定 const
修饰的是指针本身和指针指向的内容。
const char *const p
:第一个const
修饰指向的内容,第二个const
修饰指针本身。
示例代码:
#include <stdio.h>
int main() {
const char *const p = "Hello";
// 不能通过指针 p 修改指向的内容
// *p = 'h'; // 错误:不能修改 p 指向内容的值
// 不能改变指针 p 本身的值
// p = "New Hello"; // 错误:不能改变指针 p 本身
printf("p: %s\n", p);
return 0;
}
// 输出结果:
// p: Hello
4. char *p const
这种声明在C语言中是无效的,因为 const
不能修饰指针之后。指针的常量属性必须在指针名称之前声明。
// 错误示例:
// char *p const;
// 编译错误:在C语言中,不允许这种声明。
判断方法总结
const
在*
之前:表示指针指向的内容是常量,不能通过指针修改内容,但可以改变指针本身。- 示例:
const char *p
、char const *p
- 示例:
const
在*
之后:表示指针本身是常量,不能改变指针的值,但可以通过指针修改指向的内容。- 示例:
char *const p
- 示例:
- 两个
const
:第一个const
修饰指向的内容,第二个const
修饰指针本身,指针和指向的内容都是常量。- 示例:
const char *const p
- 示例: