一文搞懂C++引用与指针
Posted keep创
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞懂C++引用与指针相关的知识,希望对你有一定的参考价值。
c++语言有几种复合类型,本文将介绍其中的两种:引用和指针。
引用用的是&表示,指针用的是*表示,但&和*在不同的上下文中有不同的意思,所以不要看到这两个符号就认为是引用和指针。
引用(reference)为对象起了另外一个名字,引用类型引用(refers to)另外一个类型。
int ival = 1024;
int &refVal = ival;
int &refVal2; //报错,引用必须被初始化
引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。
指针(pointer)是指向(point to)另外一种类似的复合类型。与引用类似,指针也实现了对其他对象的间接访问。下表是指针和引用的差异点:
名称 |
是否为对象 |
是否需要定义时赋初值 |
引用 |
否 |
是 |
指针 |
是 | 否 |
利用指针访问对象
int ival = 42;
int *p = &ival;//p存放着变量ival的地址,也可以说p是指向变量ival的指针
cout << *p <<endl;//由符号*得到指针p所指的对象,输出42
某些符号有多重含义
int i = 42;
int &r = i;//&紧跟着类型名出现,因此是声明的一部分,r是一个引用
int *p;//*紧跟着类型名出现,因此是声明的一部分,p是一个指针
p = &i;//&出现在表达式中,是一个取地址符
*p = i;//*出现在表达式中,是一个解引用符
int &r2 = *p;//&是声明的一部分,*是一个解引用符
在声明语句中,&和*用于组成复合类型;在表达式中,它们的角色又转变成运算符。在不同的场景下出现虽然是同一个符号,但由于含义截然不同,所以我们完全可以把它当作不同的符号来看待。
建议:初始化所有指针,因为未经初始化的指针所引发的后果是无法预计的。
有时候要想搞清楚一条赋值语句到底是改变了指针的值还是改变了指针所指对象的值不太容易。最好的办法就是记住赋值永远改变等号左侧的对象。
pi = &ival;//pi的值被改变,现在pi指向ival
指向指针的指针
int ival = 1024;
int *pi = &ival;
int **pi = π//ppi指向一个int型的指针
指向指针的引用
int i = 42;
int *p;
int *&r = p;//r的一个对指针p的应用
r = &i;//r引用了一个指针,因此给r赋值&i就是令p指向i
*r = 0;//解引用r得到i,也就是p所指向的对象,将i的值改为0
要理解r的类型到底是什么,最简单的办法是从右到左阅读r的定义。离变量名最近的符号(此例中是&r的符号&)对便利的类型有最直接的影响,因此r是一个引用
以上是关于一文搞懂C++引用与指针的主要内容,如果未能解决你的问题,请参考以下文章