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
可以控制指针和指向的值是否可变。
声明 | 含义 |
| 常量整数,等价于 ,不能修改其值。 |
| 常量整数,等价于 ,不能修改其值。 |
| 指向常量整数的指针,不能修改指针指向的值, 但可以改变指针指向的地址。 |
| 指向常量整数的指针,等价于
|
| 常量指针,指向整数,不能改变指针指向的地址, 但可以修改指针指向的值。 |
| 常量指针指向常量整数,既不能修改指针的指向, 也不能修改指针指向的内容。 |