概述
在之前的博客中,简要介绍了c语言和c++中const的用法和不同点,今天给大家详细介绍一下const与指针、引用、形参列表以及返回值相结合的用法。
一、const与指针结合
1、const int a=10;
int *p=&a;// error
原因:const修饰的是变量a,所以a是一个常量,不可修改,但是可能通过*p操作修改a的值,所以错误
2、const int a=10;
const int *p=&a;// true
原因:a是常量,*p也无法操作,也就不能改变a的值
3、 const int a=10;
int *constp=&a;// error
原因:a是常量,第二个式子中,const修饰的是p,意思是p指向a的内存块的指向不变,不能有int b=20;p=&b操作,但是可以通过*p改变a的值,所以错误
4、const int a=10;
const int *p=&a;
int **q=&p;// error
原因:可以通过*q改变p的值,**q改变a的值,但是a和*p都是不可变的
5、int a=10;
int *const p=&a;
const int **const q=&p;// true
原因:**q和q无法操作,但是可以操作*q,进而改变p的值,也可以通过*p改变a的值
6、int a=10;
int *p=&a;
int *const *q=&p;// true
原因:const修饰的是*q,意味着通过*q间接修改p是不能操作的,但是直接修改p是可以的,这两者是不冲突的
const与二级指针相结合的时候,如果是直接操作,则没有问题。如果是间接操作,则存在风险,需要避免这种风险
二、const与引用结合
1、int a=10;
int &b=a;// error
原因:在底层,int &b=a就相当于int *b=a,如果操作&a,就错误了,常量没地址
2、const int a=10;
int &b=a;// error
原因:a之前有const修饰,不可变,但是可能通过b修改a的值,所以错误
3、const int a=10;
int const &b=a;//true
原因:因为&不参与类型,所以const修饰的是b
4、const int &b=10;// true
原因:在底层,不是直接对立即数取地址,而是先将立即数的值存入临时变量,然后将临时变量的地址传给b
5、int a=10;
const int &b=a;// true
原因:const int &b=a就相当于const int*b=&a,const修饰的是*b
6、int a=10;
int *const q=&a;
int *&p=q;// error
原因:可以通过*p修改q,但是在第二个式子中q是不可改变的,所以错误
总结:
普通引用 引用 普通变量
普通引用 引用 常量 //错误
普通引用 引用 立即数 //错误
常引用 引用 普通变量/常量
常引用 引用 立即数
三、const与指针、引用、返回值的结合
1、int sum()
{
int tmp=10;
return tmp;
}
int main()
{
int &b=sum();//错误 被调用函数的返回值是一个立即数,而且是由一个寄存器带回的,不能对立即数取地址
const int &b=sum();//正确 加了const之后变成了常引用
return 0;
}
2、int* sum()
{
int tmp=10;
return tmp;
}
int main()
{
int *const &p=sum();// 正确
return 0;
}
最后
以上就是安详发带为你收集整理的const的指针和引用的全部内容,希望文章能够帮你解决const的指针和引用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复