1. C语言指针与const的深度解析
指针是C语言中最强大也最容易出错的功能之一,而const关键字与指针的结合使用,更是让许多初学者感到困惑。在实际开发中,合理使用const指针不仅能提高代码安全性,还能向其他开发者传达明确的意图。下面我将通过实例详细讲解const与指针的各种组合方式及其含义。
1.1 指向常量的指针(const在*左侧)
先看这段典型代码:
c复制#include<stdio.h>
int main()
{
int i = 25;
int j = 50;
const int *p = &i; // 或等价写法:int const *p = &i;
// *p = 52; // 编译错误:不能通过p修改i的值
p = &j; // 合法:可以改变指针指向
printf("*p = %d\n", *p); // 输出50
return 0;
}
这种形式的const修饰的是指针指向的数据,而不是指针本身。它告诉编译器:"这个指针指向的数据不应该通过这个指针被修改"。但请注意:
- 数据本身可能不是常量(如本例中的i和j)
- 可以通过其他方式修改数据(如直接修改i)
- 指针本身可以指向不同的对象
提示:const int *p和int const *p是完全等价的,const放在类型前或后都可以,但建议保持团队代码风格一致。
1.2 常量指针(const在*右侧)
再看另一种情况:
c复制#include<stdio.h>
int main(void)
{
int i = 20;
int j = 50;
int *const p = &i; // const在*右侧
*p = 25; // 合法:可以修改指向的数据
// p = &j; // 编译错误:不能改变指针指向
printf("i = %d\n", i); // 输出25
return 0;
}
这里的const修饰的是指针变量本身,表示"这个指针一旦初始化后就不能再指向其他地址"。但:
- 可以通过指针修改指向的数据
- 必须在定义时初始化
