const的关键字

本文详细解释了C/C++中const关键字的用法,包括修饰变量使其不可变,以及如何通过指针影响const变量。讨论了常量指针、指针常量和常量指针常量的区别,以及在函数参数和返回值中的应用。
摘要由CSDN通过智能技术生成

1、修饰变量

修饰变量

用法:

int const i=6;或

const int i=6;

这两种写法是一致的,都表示变量i的值不能被改变了。需要注意的是,用const修饰变量时,一定要变量初始化,否则之后就不能再进行赋值了。

代码展示:

注释:右边的两次输出结果中,第一次是正常输出,第二次报红的是,想再次给变量赋值,造成的。

const的修饰的常量是否可以修改

1、从上面我们已经看出来,简单的直接赋值行不通

2、当我们学习过指针之后,用指针可以改变const修饰的变量的值。

代码如下:

在C语言中,const变量只不过是修饰该变量名,它并不能使内存变为只读。也就是说,我们不能通过变量名再去操作这块内存。但是可以通过其它方法,如指针,通过指针是可以修改被const修饰的那块内存的。

注释:上述代码中,用到强制类型转换是为了保持类型一致,在一些编译器上不写这一步骤也不会报错,是应为编译器功能强大,给你优化了。所以为了安全起见,还是不能省略。

拓展部分:在c++的情况下const运行情况

相同的内存空间为什么输出的数值是不同的?

在c++下,写下 const int j= 5; 后,j不是被分配在栈上,而是在符号表中以键值对的方式存储,在此情况下,j是可以被当成变量的,它的值就是5.
而当我们对const修饰的局部变量取地址的时候,其实c++的编译器在内部帮我们做了一些事情。编译器给变量j分配了一个临时的内存空间temp。p指针指向的是temp,所以修改的其实是temp的值。     

原文链接:https://blog.csdn.net/qq_42425563/article/details/118914903

const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,            

注释    :从上述代码中可以看出来,当我们运用C语言中修改const修饰的变量的方法时,发现此时输出的变量数值并没有改变j的值依旧是5没有发生变化。

2、修饰指针常量和常量指针

1、常量指针:不能修改指针所指向地址的内容。但可以改变指针所指向的地址。

用法:int const *psp;和

const int  *psp;

表达都是psp是指向const 的指针。

代码示例:

ab明明是一个变量,为什么可以赋值给一个指向常量(const)的指针?原因是这里发生了隐式的类型转换,&ab是一个int * 类型,而psp是一个const int * 类型,从int *到const int *是从大范围到小范围,C++进行了隐式的转换,所以能够赋值成功前一节的从const int * 到int * 是从小范围到一个大范围,无法进行隐式类型转换,所以必须进行强制(显式)类型转换才能赋值成功就是这个原因了。

注释:1、可以通过改变指向的空间改变数值
           2、可以通过改变指向的变量的数值改变
            3、不能直接改变*psp的数值

 2、指针常量:不能修改指针所指向的地址

    用法:

int *const  qsq;

代码示例:

注释:1、可以直接通过修改*qsq即指针的内容来改

            2、可以通过修改指向变量的值来改变

           3、不能通过修改指针的指向来改变内存的数值

(从这可以看出const放在*左侧修饰的是指针的内容,const放在*右侧修饰的是指针本身.)

3、常量指针常量

用法:const int* const p = &a 或

int const* const p = &a

注释:1、指针指向的地址不可以修改

          2、 指针指向的值不可以修改

3、修饰函数参数

1、值

:值传递的 const 修饰传递,一般这种情况不需要 const 修饰,因为函数会自动产生临时变量复制实参值。

2、指针

(这一点可以对比这const修饰的指针来看,这样子更好理解)

1、防止修改指针指向的内容

2、防止修改指针指向的地址

注释:虽然不能修改指针的地址,但可以修改指针的内容,而且会影响到实参。

注释:上面代码中当我们想修改函数的地址时,就给出了警告。

3、以上两种的结合。

注释:既不能修改地址也不能修改内容。

4、修饰函数返回值

1、指针

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

注释:上面的代码的最后的int *pp2和int const *pp 是应为类型范围大小的隐式转换,造成的。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值