const可以修饰变量、修饰指针
1.const修饰变量(常变量)
const修饰变量n后,保护了变量n,使其不能被赋值修改。(但可以使用指针修改)
#include <stdio.h>
int main()
{
const int n = 10;
//n = 20;
printf("%d\n", n);
//可以使用指针修改
int *p = &n;
*p = 20;
printf("%d\n", n);
return 0;
}
2. const修饰一级指针
<1> const放在*左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变(但是指针本身的内容可以改变)
const int *p = &n; n里面的值不能被改变
*p = 20; //会报错
<2> const放在*右边,修饰的是指针变量本身,保证了指针变量的指向不能修改,(但是可以通过指针改变指针指向的内容)
int * const q=&a;//const修饰q本身,q的本身不能做修改,即q的指向不能修改
*q = 10; //但q指向的内容可以修改
<3> *前后都有const,此时指针本身以及指向的内容均不能修改
int a=0;
int b=0;
int main(){
const int* const r = &a; //此时r本身和r指向的内容均不能修改
*r = 10; // F 修改了r指向的内容
r = &b; // F 修改了r本身
}
3. const修饰二级指针
<1>
int a = 0 ;
int b = 0 ;
const int * p = &a ;
int * const q = &a;
int **s = &p ; //定义二级指针s,指向p
s = &q ; // 由上条语句,定义二级指针s时没有限定,所以该语句正确
**s = 20 ; // 正确,此处通过s改变a的值
<2>
int a = 0 ;
int b = 0 ;
const int * p = &a ; // 此处限定a,不能通过*p修改,但可以改变p的指向
const int **t = &p ; //定义二级指针t指向p,p又指向a,由于*p不能被修改,所以**t也不能被修改
*t = &b ; // T *t没有限制,可以指向其他内容
**t = 10 ; // F **t不能被修改
<3>
int a = 0 ;
int b = 0 ;
int *const q = &a ; //q的指向不能改变,但q指向的内容可以通过*q改变
int *const *s = &q ; // 定义二级指针s,限定了q,不能通过*s改变
*s = &b ; // F 指向不能改变
**s = 100 ; // T **s无限制
总结:对于一级指针,分清楚const修饰的是谁,哪些可以变,哪些不能变,在上述代码都有明确 描述。 二级指针只是一级指针的深入理解