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=&pi;

那么,如何理解 “    const int * const p=t;    ”呢?

第二个const保证p本身是常量指针,第一个const保证p指向的是一个常量

我们把第一个称为底层const,第二个称为顶层const。在相互的赋值,拷入拷出,要尤为注意。

以上是关于C++ | 指针引用及const(两个容易蒙的地方))的主要内容,如果未能解决你的问题,请参考以下文章

深入理解C++的const限定符

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

C++中的const关键字深入理解(关于引用指针顶层const)

c++的const总结(转)

如何将 const 字符串引用与字符串指针进行比较?

小白学习C++ 教程八在C++指针传递引用和Const关键字