目录
一、const修饰变量
绕过const限制的问题
二、const修饰指针变量
1、无const修饰的指针
2、const放在*左边
3、const放在*右边
4、*两边都有const
三、使用建议
四、记忆技巧
一、const修饰变量
在C语言中,变量默认是可修改的。如果我们希望某个变量不能被修改,可以使用const
关键字进行修饰。
#include <stdio.h>int main()
{int m = 0;m = 20; // m是可以修改的const int n = 0;n = 20; // 编译错误:n不能被修改return 0;
}
const
修饰的变量n本质仍然是变量,但在语法层面添加了限制,任何直接修改n的操作都会导致编译错误。
绕过const限制的问题
虽然直接修改const变量会导致编译错误,但通过指针间接修改在语法上是可能的:
#include <stdio.h>int main()
{const int n = 0;printf("n = %d\n", n); // 输出: n = 0int* p = &n; // 获取n的地址*p = 20; // 通过指针修改n的值printf("n = %d\n", n); // 输出: n = 20return 0;
}
运行结果:
这种操作虽然能修改n的值,但违背了使用const的初衷。为了真正保护变量不被修改,我们需要正确使用const修饰指针。
二、const修饰指针变量
const修饰指针变量时,根据const关键字相对于星号(*)的位置不同,其含义也不同:
int * p;//没有const修饰? int const * p;//const 放在*的左边做修饰
//上面这一句等价于
const int * p;//const 放在*的左边做修饰 int * const p;//const 放在*的右边做修饰
1、无const修饰的指针
void test1()
{int n = 10;int m = 20;int* p = &n;*p = 20; // 可以修改指针指向的内容p = &m; // 可以修改指针本身
}
2、const放在*左边
void test2()
{int n = 10;int m = 20;const int* p = &n; // 或 int const* p = &n;*p = 20; // 编译错误:不能通过指针修改指向的内容p = &m; // 可以修改指针本身
}
3、const放在*右边
void test3()
{int n = 10;int m = 20;int* const p = &n;*p = 20; // 可以修改指针指向的内容p = &m; // 编译错误:不能修改指针本身
}
4、*两边都有const
void test4()
{int n = 10;int m = 20;const int* const p = &n;*p = 20; // 编译错误:不能通过指针修改指向的内容p = &m; // 编译错误:不能修改指针本身
}
三、使用建议
-
保护数据不被修改:如果希望数据不被修改,应该使用
const type*
或const type* const
形式 -
保护指针不被修改:如果希望指针本身不被修改,应该使用
type* const
形式 -
最佳实践:在函数参数中,如果函数不需要修改指针指向的数据,应该使用
const
修饰指针参数,这样既能保护数据,又能使函数接受const和非const的实参
四、记忆技巧
可以这样记忆const修饰指针的规则:
-
const在*左边:保护"星"指向的内容(数据不可变)
-
const在*右边:保护"星"本身(指针不可变)
-
两边都有const:都保护
这种修饰方式在C/C++中广泛使用,特别是在函数参数传递和API设计中,能够有效提高代码的安全性和可维护性。