深入理解C语言中const修饰指针的用法 - 指南
引言
在C语言编程中,const关键字用于定义常量,提高代码的安全性和可读性。当const与指针结合使用时,其位置不同会导致完全不同的含义。本文将详细解析const修饰指针变量的各种情况,帮助读者彻底掌握这一重要概念。
目录
const修饰指针的三种情况
1. const位于*号左边
const int *p; // 或者等价的写法:int const *p;
这种情况下,const修饰的是指针所指向的数据,表示数据是常量,不能通过该指针修改指向的值,但指针本身可以指向其他地址。
示例:
int a = 10;
int b = 20;
const int *p = &a;
// *p = 30; // 错误:不能通过p修改指向的值
p = &b; // 正确:指针本身可以指向其他地址
// *p = 40; // 错误:仍然不能通过p修改指向的值
2. const位于*号右边
int *const p;
这种情况下,const修饰的是指针本身,表示指针是常量,不能指向其他地址,但可以通过指针修改指向的值。
示例:
int a = 10;
int b = 20;
int *const p = &a;
*p = 30; // 正确:可以通过p修改指向的值
// p = &b; // 错误:指针本身不能指向其他地址
3. const在*号左右两边都有
const int *const p;
这是最严格的限制,表示指针本身和指向的数据都是常量,既不能修改指针的指向,也不能通过指针修改指向的值。
示例:
int a = 10;
int b = 20;
const int *const p = &a;
// *p = 30; // 错误:不能通过p修改指向的值
// p = &b; // 错误:指针本身不能指向其他地址
记忆技巧
为了方便记忆,可以遵循这个规则:const总是修饰它左边的符号,如果左边没有符号,则修饰右边的符号。
const int *p:const左边没有符号,所以修饰右边的int,即指针指向的数据是常量int const *p:const左边是int,所以修饰int,即指针指向的数据是常量int *const p:const左边是*,所以修饰指针p本身,即指针是常量
实际应用场景
1. 保护函数参数不被修改
// 函数不能修改str指向的内容
void print_string(const char *str)
{
// str[0] = 'A'; // 错误:不能修改const修饰的内容
printf("%s\n", str);
}
2. 定义指向常量的指针
const char *days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
// days[0][0] = 'X'; // 错误:不能修改字符串常量
3. 硬件寄存器映射
// 指向硬件寄存器的指针,寄存器值可变,但地址固定
volatile uint32_t *const uart_status = (uint32_t*)0x10000000;
*uart_status = 0x01; // 可以修改寄存器值
// uart_status = ...; // 错误:指针地址不可变
注意事项
1. 将非const指针赋给const指针是允许的(添加const限定
int a = 10;
int *p1 = &a;
const int *p2 = p1; // 正确
2. 将const指针赋给非const指针需要强制类型转换(去除const限定)
const int a = 10;
const int *p1 = &a;
int *p2 = (int*)p1; // 需要强制转换,但不推荐
// *p2 = 20; // 未定义行为,可能导致程序崩溃
3. 字符串字面量默认具有const属性
char *str = "Hello"; // 不推荐,可能产生警告
// str[0] = 'h'; // 未定义行为
const char *str2 = "Hello"; // 推荐写法
总结
理解const修饰指针的不同用法是C语言编程中的重要技能。正确使用const可以提高代码的安全性、可读性和可维护性。记住以下要点:
const在*左边:指向的数据不可变,指针可变const在*右边:指针不可变,指向的数据可变const在*两边:指针和指向的数据都不可变
在实际编程中,应根据需要选择适当的const用法,特别是在函数参数传递和硬件访问等场景中,合理使用const可以避免许多潜在的错误。
希望本文能帮助你彻底掌握const修饰指针的用法,写出更加健壮和安全的C语言代码!

浙公网安备 33010602011771号