1. 修饰指针所指向的内容
当const
修饰指针所指向的内容时,你不能通过这个指针去修改它所指向的数据。但是,你可以改变指针本身的值,让它指向另一个地址。
#include <stdio.h> int main() { const int a = 10; // a是一个常量,其值不可变 int b = 20; const int* ptr = &a; // ptr是一个指向const int的指针,指向a // 以下尝试修改ptr所指向的内容是非法的 // *ptr = 20; // 错误:赋值给只读位置 // 但是可以改变ptr的值,让它指向另一个int变量 ptr = &b; // 正确:ptr现在指向b // 因为ptr现在是指向b的,而b不是const,所以可以通过ptr修改b的值 *ptr = 30; // 正确:b的值现在变成了30 printf("b = %d\n", b); // 输出:b = 30 return 0;
}
2. 修饰指针本身
当const
修饰指针本身时,你不能改变指针的值(即它所指向的地址),但是你可以通过这个指针去修改它所指向的数据(如果这些数据不是const
的)。
#include <stdio.h> int main() { int a = 10; int b = 20; int* const ptr = &a; // ptr是一个const指针,指向int,指向a // 以下尝试修改ptr的值是非法的 // ptr = &b; // 错误:赋值给只读变量 // 但是可以通过ptr修改它所指向的内容 *ptr = 30; // 正确:a的值现在变成了30 printf("a = %d\n", a); // 输出:a = 30 return 0;
}
3. 同时修饰指针和指针所指向的内容
#include <stdio.h> int main() { const int a = 10; int* const ptr = (int* const)&a; // *ptr = 20; // 错误:如果ptr正确声明为const int* const,这一行将是非法的 // ptr = &another_int; // 错误:ptr的值也不能被修改 // 注意:上面的ptr声明实际上是不安全的,因为它试图让一个指向const int的指针变成可变的 // 正确的做法是 const int* const safe_ptr = &a; // safe_ptr既不能改变,也不能通过它修改a的值 return 0;
}