请问一下为什么使用了const常量修饰了变量但是还是可以修改呢

请问一下为什么使用了const常量修饰了变量但是还是可以修改呢

img

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 之后既起到了保护作用,也提高了程序效率。

(此段解释来源于网络资料,具体地址有所忘记,侵权可联系删除,但愿有所帮助)

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/249040
  • 这篇博客也不错, 你可以看下const与非const类型赋值问题
  • 除此之外, 这篇博客: 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;
    
    
  • 您还可以看一下 王健伟老师的C++语言基础到进阶课程中的 函数新特性、内联函数、const详解小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    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修饰的变量为什么可以被修改。若有任何疑问,请随时追问。