C++ | 指针引用及const(两个容易蒙的地方))
Posted 从0到1的点云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ | 指针引用及const(两个容易蒙的地方))相关的知识,希望对你有一定的参考价值。
一
指针及引用的基础各大教程都有,但一混合起来用就蒙了,与其蒙下去,不如花费时间一次搞清楚。
int *p=nullptr;
int a=0,&b=a;
可知,p是指向nullptr的指针,b是a的引用,即p指向nullptr,b代表a;
若int *& r=p,且已知p是指针,那么r到底是什么类型呢?
这里,技巧是将int *&r从右往左看,靠近r的是&,说明他是一个引用,其余修饰符都是对该引用的修饰,即int *代表是整形指针,连起来就是对整形指针的引用。终于真相大白,r代表p,*p的作用和*r一样。这是对指针的引用的语法。
同理,可考虑int **&r=p;
有如下验证代码
int main()
{
int a = 10;
int *p = &a;
int **p2 = &p;
int **&t = p2;
cout << **t << endl;
}
最终打印结果是10,说明r是对指针的指针的引用,**r作用等同于**p2。
这是对指针的指针的引用的语法。
二
const常量限定符
大家都知道,用const修饰的限定符使变量的值不被改变
需要注意的是,默认状态下,const对象仅在文件内有效,若要使const 对象在另外一个文件也是可见的,则无论在声明还是定义都要加extern关键字
加入指针后,const和引用、指针联系起来就复杂了许多,这里一次讲清楚。
若a是常量,则对常量的引用必须也加const
const int a=0;
const int &b=a;
若a不是常量,对a的引用可加可不加const,加上const就不能通过b改变值,但仍可通过a改变值。
int a=0;
const int &b=a;
在没有引入指针前,这两种写法作用完全一样。
const int a;
int const a;
const double pi=3.1415926;
const double *p=π
那么,如何理解 “ const int * const p=t; ”呢?
第二个const保证p本身是常量指针,第一个const保证p指向的是一个常量
我们把第一个称为底层const,第二个称为顶层const。在相互的赋值,拷入拷出,要尤为注意。
以上是关于C++ | 指针引用及const(两个容易蒙的地方))的主要内容,如果未能解决你的问题,请参考以下文章
C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用