请问一下为什么使用了const常量修饰了变量但是还是可以修改呢
const 定义的变量,只能赋值1次。
const 在函数中根据修饰的位置分为三种:函数参数、函数返回值、成员函数。
const int fun (const int a) const;
const修饰函数参数 :
修饰函数形参;函数体内不能修改形参a的值。 如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。 所以:const 只能修饰输入作用的参数
如果参数为指针 :
如果输入参数为指针,加上const之后就会起保护指针意外修改的作用。
void StringCopy(char* strDest, const char* strSource);在这个函数定义中,我们的的参数strsource加上const修饰,就是为了防止strsource被修改。
可以起到保护作用的原因是:
实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。形参加上const 修饰之后,保护了这一块内存地址不被修改,如果刻意修改这一块内存,编译器会报错。
如果参数为引用 :
如果输入参数为引用,加上const 之后既起到了保护作用,也提高了程序效率。
(此段解释来源于网络资料,具体地址有所忘记,侵权可联系删除,但愿有所帮助)
#include <stdio.h>
#include <stdlib.h>
int main(void){
int wife = 24;
int girl = 18;
printf("老婆的初始年龄:%d\n",wife);
printf("女孩的初始年龄:%d\n",girl);
//第一种
int *zha_nan = &wife;
*zha_nan = 25;
zha_nan = &girl;
*zha_nan = 19;
printf("渣男的girl: %d 渣男的wife: %d\n",girl,wife);
system("pause");
return 0;
}
####有const修饰时
看const修饰的是离类型(int)近,还是离指针变量名近,离谁近就修饰谁,谁就不能变。
//第二种
const int *zhi_nan = &wife;
// *zhi_nan = 26;//error C3892: “zhi_nan”: 不能给常量赋值(离int近,所以不能修改wife的值)
printf("直男老婆的年龄:%d\n",*zhi_nan);
zhi_nan = &girl;//但指针变量还可以继续指向别的地址
printf("直男女孩的年龄:%d\n",*zhi_nan);
//第三种
int *const nuan_nan = &wife;
*nuan_nan = 26;//因为离指针变量近,所以能修改int类型wife的值
printf("暖男老婆的年龄: %d\n",wife);
//nuan_nan = &girl;//error C3892: “nuan_nan”: 不能给常量赋值(所以也就不能修改指针变量的值,也就是不允许指向别的地址)
//第四种(指针变量和int类型变量都有修饰,所以相互之间都不能再修改)
const int *const super_nuan_nan = &wife;
//*super_nuan_nan = 28;//error C3892: “super_nuan_nan”: 不能给常量赋值
//super_nuan_nan =&girl;
const常量修饰的变量为什么可以被修改?
首先,const关键字用于修饰变量,使其成为常量,具有常属性。常属性表示变量的值不能被修改,但可以进行初始化。
在C语言中,const修饰的常变量只是在语法层面限制了变量不能直接被改变,但本质上它仍然是一个变量。因此,虽然const修饰的变量不能直接修改,但通过其他手段仍然可以改变其值。
一个常见的例子是通过强制类型转换来修改const变量的值。通过将const变量的地址赋给一个非const指针,然后通过指针来修改所指向的地址中的数据。例如:
const int n = 9;
int* p = (int*)&n;
*p = 10;
上述代码中,通过强制类型转换,将const变量n的地址赋给非const指针p,并通过p修改了所指向的地址中的数据。但是需要注意的是,n本身没有被修改,只是通过指针p修改了指向的内存中的数据。
这是因为C++中的常量折叠机制,const变量的值放在编译器的符号表中,计算和访问时编译器直接从表中取值,省去了访问内存的时间。因此,对const变量的修改只能通过指针间接修改,但const变量本身的值是不会改变的。
需要注意的是,修改const类型的数据是一种不安全的行为,会导致不可预测的结果,因此不推荐这样做。以上只是为了说明const常量修饰变量可以被修改的原因,但并不建议在实际开发中这样使用。
希望以上解释能够帮助理解const修饰的变量为什么可以被修改。若有任何疑问,请随时追问。