引用(reference)
引用为对象起了另一个名字
int ival = 1024; int &refVal = ival; //refVal指向ival,是ival的另一个名字 int& refVal2 = ival;
引用必须被初始化,不存在空引用,无法令引用重新绑定到另外一个对象
int &refVal; //报错,引用没有初始化
定义了一个引用后,对其进行的所有操作都是在与之绑定的对象上进行的
refVal = 2; //将2赋给了refVal指向的对象 int &refVal3 = refVal; //将refVal3绑定到refVal绑定的对象上
引用本身不是一个对象,所以不能定义引用的引用
引用的类型要和与之绑定的对象严格匹配,引用类型的初始值必须是一个对象
int &refVal4 = 10; //错误:引用类型的初始值必须是一个对象 double a = 3.14; int &refVal5 = a; //错误:类型不匹配
两个例外
//1.在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型 int i = 42; const int &r1 = i; const int &r2 = 42; //正确:r2为一个常量引用 const int &r3 = r1 * 2; //正确:r3为一个常量引用 //2.存在继承关系的类,可以将基类的指针或引用绑定到派生类对象上。
指针(pointer)
指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
指针无需在定义时赋值,在块作用域内定义的指针如果没有初始化,也将拥有一个不确定的值。
int *ip1; //ip1是指向int型对象的指针 int* ip2; //合法但容易产生误解 int* a,b; //a为指向int的指针,b为int型变量
指针存放某个对象的地址,要想获取该地址,需要使用取地址符(&)
int ival = 42; int *p = &ival; //p存放变量ival的地址,或者说p是指向变量ival的指针
除两种例外情况,其他所有指针的类型都要和它所指向的对象严格匹配
如果指针指向一个对象,则允许使用解引用符(*)来访问该对象
cout << *p; //输出42 *p = 0; //为*p赋值实际上是为p所指的对象赋值 cout << *p; //输出0
空指针(null pointer)
不指向任何对象
int *p1 = nullptr; //等价于int *p1 = 0;
void*指针
void *pv = &obj; //obj可以是任意类型的对象
指向指针的指针
int ival = 1024; int *pi = &ival; //pi指向一个int型的数 int **ppi = π //ppi指向一个int型的指针
指向指针的引用
int i = 42; int *p; int *&r = p; //r是一个对指针p的引用
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!