C++中const的一些知识点

C++和C语言const的区别

const初步理解:修饰的值不能再作为左值。初始化完成后值不能被修改

C语言中:

void main(){
	const int a;//可以不用初始化不会报错,但若如此做再也没有机会给他合法的值
	const int b = 10;
	int array[b] = {};//这一句会报错,C语言中const修饰的量不是常量,应称为常变量,不能按照常量使用
	int *p = (int *)&b;
	*p = 20;//可以运行,const修饰的变量只在语法上保证不能作为左值,其值仍可被修改
	printf("%d %d %d\n",b,*p,*(&b));结果为20 20 20
}

C++中:

void main(){
	const int a;//必须初始化否则报错
	const int b = 10;
	int array[b] = {};//不会报错,C++中const修饰的量就是常量
	int *p = (int *)&b;//不能把常量的地址泄露给变量
	*p = 20;//确实改了b内存的值,只不过打印时永远打印的是它的初始化
	printf("%d %d %d\n",b,*p,*(&b));结果为10 20 10
}

概括区别:C中const就是被当作变量来编译生成指令的;C++中所有出现const常量名字的地方都被替换成了改const常量的初始化。

void main(){
	int a = 10;
	const int b = a;//当初始化不是立即数而是一个变量时,b退化成常变量,与在C语言中相同
	int array[b] = {};//error
	int *p = (int *)&b;
	*p = 20;
	printf("%d %d %d\n",b,*p,*(&b));结果为20 20 20
}
const和一级指针的结合

规律:去掉离const最近的类型,剩下的是常量

const int *p = &a;//const修饰int,剩下的*p是常量。可以指向任意int类型的内存,但不能通过指针间接修改内存的值
int const *p = &a;//同上
int *const p = &a;const修饰int*,剩下的p是常量。不能指向其他内存,但可以通过指针解引用修改指向的内存的值
const int *const p = &a;//p和*p都是常量。不能指向其他内存,也不能通过指针解引用修改指向的内存的值
const int a = 10;
int *p = &a;//报错
const int *p = &a;//正确
int *q1 = nullptr;
int *const q2 = nullptr;
cout<<typeid(q1).name<<endl;//输出为int*
cout<<typeid(q2).name<<endl;//输出为int*
//结论:当const右边没有*时,const不参与类型
int a = 20;
int *q1 = &a;
/*一级指针转换公式*/
const int *q2 = q1;//const int * <= int* 对
int *const q3 = q1;//int * <= int* 对
int *q4 = q2;//int* <= const int* 错
int *q5 = q3;//int* <= int * 对
const和二级指针的结合
int a = 10;
int *p = &a;
int **q = &p;
//const int **q;**q不能修改,*q和q可以改
//int *const *q;*q不能修改,**q和q可以改
//int **const q;q不能修改,**q和*q可以改

/*二级指针转换公式*/
//int** <= int**对
//const int** <= const int**对
//int** <= const int**错
//const int** <= int**错
/*规律:二级及以上指针,必须两边都有或没有const才正确*/

//int** <= int*const* 即int* <= int const*,因为const左边的*不受const影响
//int** <= int**const 即int <= int const
int a = 10;
int *p = &a;
const int **q = &p;/*这一句是错误的,如果后边有这两句:const int b = 20;*q = &b;这是没问题的,因为&b的类型是const int*,*q在此处判断的类型也是const int *,但是*q和p指向了同一块地址,最后一句可视为p = &b;这样将常量的地址泄露给了普通指针故出错*/
//将第二行改成const int *p = &a;就对了,或者将第三行改成const int *const*q = &p;也可以,目的都是让*q和p同时指向的这块内存不会改变
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值