1、const int 和 int const
两种写法是完全等价的,都表示一个常量整数,也就是说,该变量的值不能被改变。const int a
和 int const b
是等价的,a
和 b
都是常量整数,不能修改其值。
#include <stdio.h>
int main() {
const int a = 10; // 使用 const int 声明常量整型
int const b = 20; // 使用 int const 声明常量整型
printf("a = %d, b = %d\n", a, b);
// 以下语句会产生编译错误,因为常量值不能被修改
// a = 15; // 错误:尝试修改常量
// b = 25; // 错误:尝试修改常量
return 0;
}
2、const int * 和 int const *
两种写法也是等价的,表示指向常量整数的指针。也就是说,指针指向的内容是常量,不能通过该指针修改该内容,但可以改变指针本身,使其指向其他位置。
#include <stdio.h>
int main() {
int x = 10;
int y = 20;
// const int * 和 int const * 是等价的
const int *ptr1 = &x; // 指向常量整数的指针
int const *ptr2 = &y; // 同样是指向常量整数的指针
printf("ptr1 points to value: %d\n", *ptr1); // 输出: 10
printf("ptr2 points to value: %d\n", *ptr2); // 输出: 20
// 尝试通过指针修改值(会报错)
// *ptr1 = 15; // 错误,不能通过 ptr1 修改 x 的值
// *ptr2 = 25; // 错误,不能通过 ptr2 修改 y 的值
// 指针本身可以指向其他地址
ptr1 = &y; // 合法,指针可以改变指向
printf("ptr1 now points to value: %d\n", *ptr1); // 输出: 20
return 0;
}
3、int * const
int * const
表示常量指针,指针本身是常量,不能改变指向的地址,但指针指向的内容可以改变。
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
// 定义常量指针 p,指向变量 a
int * const p = &a; // p 是常量指针,指向 int 类型的变量 a
// 可以通过 p 修改 a 的值
*p = 30; // 修改 a 的值,a 变为 30
printf("a = %d\n", a); // 输出: a = 30
// 不能修改 p 指向的地址
// p = &b; // 错误:不能修改常量指针的地址
return 0;
}
4、const int * const
const int * const
表示常量指针指向常量数据。指针本身是常量,不能改变指向,指针指向的内容也是常量,不能通过指针修改。
#include <stdio.h>
int main() {
int x = 10;
int y = 20;
// 定义一个常量指针,指向一个常量整数
const int * const ptr = &x;
// 试图修改 ptr 指向的值(非法)
// *ptr = 30; // 编译错误:无法通过 const 指针修改指向的值
// 试图修改指针本身所指向的地址(非法)
// ptr = &y; // 编译错误:无法修改 const 指针本身的地址
// 打印值
printf("Value pointed by ptr: %d\n", *ptr); // 输出 10
return 0;
}
5、const 关键字位置的影响
const int *
表示指向常量整数的指针,指针可以改变指向,但不能通过它修改指向的值;int * const
表示常量指针,指针本身不能改变指向,但可以修改指向的内容;const int * const
表示指向常量整数的常量指针,指针既不能改变指向,也不能修改指向的值。通过这些不同的组合,const
可以控制指针和指向的值是否可变。
声明 | 含义 |
| 常量整数,等价于 ,不能修改其值。 |
| 常量整数,等价于 ,不能修改其值。 |
| 指向常量整数的指针,不能修改指针指向的值, 但可以改变指针指向的地址。 |
| 指向常量整数的指针,等价于
|
| 常量指针,指向整数,不能改变指针指向的地址, 但可以修改指针指向的值。 |
| 常量指针指向常量整数,既不能修改指针的指向, 也不能修改指针指向的内容。 |