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、防止修改指针指向的地址![](https://img-blog.csdnimg.cn/direct/f46c8b6c91f64217b10f7c75b4f00890.png)
注释:虽然不能修改指针的地址,但可以修改指针的内容,而且会影响到实参。
注释:上面代码中当我们想修改函数的地址时,就给出了警告。
3、以上两种的结合。
注释:既不能修改地址也不能修改内容。
4、修饰函数返回值
1、指针
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
注释:上面的代码的最后的int *pp2和int const *pp 是应为类型范围大小的隐式转换,造成的。