【C++】C++中的引用与指针

想必你们对C++中的指针都有所了解,可是什么是引用呢?C++11标准引入了“引用”的新功能。ios

引用

引用(reference):给对象起了另一个名字,引用类型引用(refers to)另一种类型,经过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名:c++

int val = 1024; int &d = val;

能够认为变量名就是一个能够操控内存的标签,那么引用就能够理解为另外一个标签。新定义的标签和原来的标签均可以访问存放在内存中的数据。
例如:安全

#include <iostream> #include <cmath>
using namespace std; //声明
void add(int &a,int b); bool& isZero(float f); int main(){ double dval = 0.1; double &d = dval; d+=0.1; cout << "d is " << d << endl; //使用引用做为函数参数
    int val = 20; add(val,5); cout << "val is " << val << endl; //使用引用做为函数返回值
  float fv = 0.000000004f; bool &v = isZero(fv); if(v) cout << "float 0.000000004 is zero" << endl; else cout << "float 0.000000004 is not zero" << endl; return 0; } //定义
void add(int &a,int b){ a+=b; } bool& isZero(float f){ bool b = false; if(abs(f) < 0.0000001) b = true; bool &rb = b;//不推荐返回局部变量的引用,由于当isZero函数执行完后,b变量的内存颇有可能会被回收
    return rb; }

输出结果为:函数

d is 0.2 val is 25 float 0.000000004 is zero


C++官方推荐使用引用以一种更安全的方式向函数传递数据和获取返回值。

可使用常量引用引用一个常量,
好比:spa

const int &i = 10;

指针

指针(pointer):是能够指向(point to)另一种数据类型的数据类型,经过将声明符写成*d的形式定义指针,其中d是变量名。
取地址符(&):获取对象的地址。
解引用符(*):获取指针所指向的对象。指针

int v = 10; int *p = &v; int **m = &p;

p是一个int类型的指针,指向一个int类型,上面的例子中指向了变量v。
m是一个int*类型的指针,指向一个int*类型,上面的例子中指向了变量p。
这里说指向某个对象就是指存放某个对象的地址。指针就是指地址,地址就是指针。指针变量就是存放内存单元编号的变量,或者说指针变量就是存放内存地址的变量。

这张图片解释了上面这段代码的地址指向问题,变量p存放了变量v的内存地址,变量m存放了变量p的内存地址。

在判断某个对象的类型的时候,应该从右向左阅读(离变量名最近的符号对变量类型有最直接的影响),好比c++11

int ****p; int ****&r = p;

上面的int ****p;离p最近的是第四个*,因此p是一个指针,剩余的部分肯定该指针指向的类型,第四个*号左边是int ***,因此指针p指向一个int ***类型。再看变量r,离r最近的是&,因此r是引用,剩余的部分肯定该引用引用的类型,剩余的是int ****,因此r引用了一个int ****类型的变量。

空指针不指向任何对象,使用字面值NULL表示,c++11标准还提供了字面值nullptr也能够得到空指针。

void*是一种特殊的指针类型,可用于存听任意对象的地址。一个void*指针存放着一个地址,这一点和其余指针相似。可是不能直接操做void *指针所指的对象,由于并不知道对象究竟是什么类型。若是要使用void *所指的对象,应该使用强制类型转化。code

引用与指针

引用和指针的比较:
1.引用不能引用NULL。
2.一旦引用被初始化引向某一个对象后,它就不能再引向另外一个对象。指针能够屡次改变指向的对象。
3.引用在建立的时候,必须初始化。指针能够在被建立时不被初始化,能够等须要的时才初始化。
4.引用不是对象,没有实际的地址。指针是一个对象,有实际的地址。指针不能指向引用(由于引用不是对象)。对象

相关文章
相关标签/搜索