const关键字
const关键字也许应该被替换成readonly(只读);
1.1const修饰变量
const修饰的变量,不可直接被修改——但是可以间接修改,使用指针
那么const修饰变量的意义在哪里?(const修饰变量的本意是不让他修改,可是却可以绕开变量,使用指针修改,那么意义何在?)
答:
1.const修饰变量,这个关键字是给编译器看的,让我们的编译器在编译代码时对用const修饰的变量进行语法检查,凡是在后续代码当中,直接对有const修饰的变量进行修改行为时,编译器会直接报错;是程序员告诉编译器,这个变量不想在后续的代码被自己或被别人改掉;当有人直接更改时,编译器会报错;若不加const,当有人修改变量时,可能会造成代码的逻辑错误;
2.告诉其他程序员(正在改你的代码,或者阅读你的代码),这个变量后边不要更改,也属于一种自描述
const int a=10; //可以放在类型之前,也可以类型之后,二者等价的;
int const a=10; //建议放在类型之前
a=20; //不可直接修改,会报错int* p=(int*)&a; //强转一下类型
*p =20; //使用地址来改变a的值;
const修饰的变量,不能作为数组定义的一部分,C标准库不可以;但是gcc标准可以
const int n=100;
int arr[n]; //会报错;数组空间开辟的时候,元素个数(中括号里的内容必须是真常量; //编译器不会认为n是真常量)
1.2const修饰数组
const 修饰数组,代表数组不可被修改
const int arr[]={0,1,2,3}; //只读数组;
arr[0]=0; //会报错
arr[1]=0;
1.3const修饰指针
用户必须明确,const修饰的数据不能通过哪一方面来改变;
int a=10;
const int *p=&a; //这两种写法一样;
int const *p=&a; //const修饰*p,不能通过*p来更改a的数据;
int * const p=&a; //const 修饰p;p的指向不能改,只能指向a;
const int * const p; //不能通过*p修改a的值;不能更改p的指向,只能指向a
1.4const修饰函数的参数
const修饰函数的参数,不希望这个参数在函数体内被改变使用
void func(const int i) //i不可以直接被改变
1.5const修饰函数的返回值
const修饰函数返回值,返回值不可被改变
const int* test(){
static int g_val=100;
return &g_val
}
int main(){
const int *p=test();
*p=200; //会报错
}
const 修饰函数返回值,如果用户不想函数返回值被别人通过指针来更改函数内部的一个变量,可以对返回值做const修饰,在外部接收的时候,采用同样的编码规则去接收;这样在后续的使用这个变量的时候,就无法做修改了;
标签:const,变量,int,关键字,编译器,报错,修饰 From: https://blog.csdn.net/qincjun/article/details/142706957