其他分享
首页 > 其他分享> > (1/30计划)*1 之 const关键字的重拾(重识)

(1/30计划)*1 之 const关键字的重拾(重识)

作者:互联网

整个6月只写了4篇博客,其实草稿箱里还有几篇草稿,但是写着写着就因为别的事情去忙活了,自己懒也有一部分吧,但是感觉每天真的其实自己还是挺充实的,忘记写总结其实是一件很痛苦的事情(尤其是Linux,想想就头大,抽象,苦涩,加上自己的代码量少,读不懂原代码库),因为意味着学习的东西你没办法按照你的方法去记住,写博客就是一场总结,别人的总结总是别人的,我得有我自己的总结,对于这个知识点的理解,昨天晚上的每日一题让我感觉C的基础还是很差劲的,记忆的东西都是似懂非懂,于是这个1/30计划酝酿出来了,计划在30天里面回顾和总结我所欠缺,记忆模糊的知识点,在在线OJ的选择题上,不能错太多题,废话也不多了,今天总结const关键字,至于这个1/30我能让这个分子变多大,我现在只能说尽力吧!

const 是C语言的关键字之一
const是constant的简写,是不变的意思,他用来修饰常量,数组和指针,是不变的意思.因此他修饰的这些类型数据之后,其内容或者指针指向是不能改变的.(根据这个英文单词就可以知道是不变的意思,再加上修饰的这些常量,数组和指针,就能明白了)
但并不是说它修饰常量,而是说它限定一个变量为只读。
还需要知道的是const关键字是编译器在编译代码期所干的事情

1.const用来修饰常量

const int Max = 10;
int const Max2 = Max; // 其实这两种写法都是可以的
Max2 = Max; 
Max2 = 30 ;			//这样是不能编译通过的
Max = 9;  				//编译错误
//由于使用了const修饰Max ,使得Max 为只读,因此尝试对Max 再次赋值的操作是非法的,编译器将会报错。
//正因如此,如果需要使用const修饰一个变量,那么它只能在开始声明时就赋值,否则后面就没有机会了(当然不排除特殊情况)

2.const用来修饰数组

const int arr[] = {1,2,3,4,5};
arr[0] = 10; //编译错误
//这个就不用多说了,是和常量修饰一样的,

3.const用来修饰指针

我觉得最让人琢磨不找的就是const用来修饰指针了,最本质的原因是因为我指针的概念不是很清晰,所以眼睛看到这种代码,脑子里面是处于杠机的状态的…

const 位于* 左侧的时候表明修饰指针所指向的变量的内容不能被修改
也就是说通过a指针不能修改temp指向的内容

int  temp = 10;
int temp2 = 100;
const int  *a = &temp;
*a = 100;      //错误
int* a1 = &temp; //不用const来修饰的普通指针是可以做出修改变量内容操作的,我们都知道
*a1 = 20;

但是可以修改指针的指向,也就是说可以让a指向别的int 类型的数据

a = &temp2;    //可以修改指针a指向变量

*左 指向变,内容不变

当const 位于* 右侧的时候表示指针指向的变量不能变,就是说b原来指向temp ,以后也只能指向temp但是可以通过解引用来改变指针变量的内容

int* const  b= &temp;
b = &temp2;	
*b = 1001;

*右内容变,指向不变

*左 *右指向内容都不可变

const int  * const c = &temp;

4.那么在实际的操作中有什么用呢?看一看字符串拷贝函数

char *strncpy(char *dest, const char *src, size_t n);//字符串拷贝函数
//字符串拷贝函数的源字符串不能改变,const在左指向变量的内容不可改变

因此在我们编码的时候,如果不需要修改传过来参数内容那么可以增加const关键词,来让传进来的参数变为只读保护,这样可以防止数据被改变

const关键字告诉了编译器,它修饰的变量不能被改变,如果代码中发现有类似改变该变量的操作,那么编译器就会捕捉这个错误。
同样的也告诉了程序员,这段代码的里面的参数是不可以被修改的
但是使用强转也可以改变const

int * d = (int *)a;
//我们人为的也可以对a的类型做出修改,但是没有人会这么做
//

加法函数的操作,当我们如果不用对参数修改的时候,就可以这样来做出const,加一个保护机制,提高代码的安全性

int  Add(const int * right, const int *left){
	//*right = 10;
	int temp = *right + *left;
	return temp;
}

5.在C/C++编译器中对于const关键字修饰变量的处理

const int  temp3 = 10;
int *ptr = (int  *)&temp3;
*ptr = 30;
cout << temp3 <<" "<<*ptr << endl;

const 在编译阶段起的作用,所以const在编译期间,已经做出了优化,也就是把temp3在编译期间已经当做了10来处理了
但是在运行的时候还会运行到这个代码,所以他的指向的内容还是会发生改变
但是在C编译器中,编译器并没有当成常数处理,而是视为一个受到读保护的变量而已

还有一个要注意的地方:C++编译器只能对内置数据类型(int, float…)做常数替换,而对于像结构体\类这样的非内置数据类型编译器不知道怎么替换,所以就不替换,

总结

const关键字让编译器帮助我们发现变量不该被修改却被意外修改的错误。
const关键字修饰的变量并非真正意义完完全全的只读。
对于不该被修改的入参,应该用const修饰,这是const使用的常见姿势。
const修饰的变量只能正常赋值一次。
不要试图将const数据的地址赋给普通指针。
不要忽略编译器的警告,除非你很清楚在做什么。
虽然可以通过某种不正规途径修改const修饰的变量,但是永远不要这么做。

标签:重识,const,temp,int,30,编译器,修饰,指针
来源: https://blog.csdn.net/weixin_44077227/article/details/94396603