【M1】仔细区别pointers和references

1、引用必须初始化,而且不能修改指向,这一点和const对象十分相似。

2、引用和指针用法不同,对于引用int& ri = a; rhs是个对象,引用前面加&;对于指针,int* pi = &a; rhs是个对象地址,指针前面加*。注意:引用往往是用指针实现的,从int& ri = a; 可以认为a赋给ri,再取地址。

3、引用是一个对象的别名,不能指向为空,而且自始至终是这个对象的别名。指针是地址,可以指向为空,也可以指向不同的对象。

4、考虑对引用初始化:引用是一个对象的别名。引用不能指向为空,但是通过一定技巧,可以让引用指向为空。考虑,先让指针指向为空(0),解引用赋值给引用,那么这个引用就指向为空。如下:char* pc =0; char& rc = *pc; 这将导致未定义行为。对引用初始化,必须是下面的情况之一:

  a、右端是一个对象。如果是常量(包括文本常量和具名常量),只能初始化const引用,因为常量不能修改。如果不是常量,可以初始化const引用或者non-const引用。

  b、右端是另一个引用。

5、考虑对指针初始化和赋值:指针是个地址,本身就是一个int值。但是,不能使用int值赋值给指针(0除外)。对指针初始化或者赋值,rhs必须是下面的情况之一:

  a、赋值为0,表示为空,不能使用其他int值,如果非要使用,必须使用reinterpret_cast进行转化。

  b、另一个指针。

  c、对一个对象取地址。

  d、使用new 返回一个地址。

6、重载操作符返回引用。比如[],v[5] = 10; 如果返回指针,必须这样写 *v[5] = 10; 这显然很别扭。

7、考虑下面的情况:资源管理对象,内部有一个指针,指向heap对象。现在交换两个资源管理对象,该怎么做?

  这种情况,只需要交换指针值就好了,不需要对指向的对象内容进行交换。举例来说,甲有房间钥匙501,乙有房间钥匙502,现在要求甲乙换房。如果你去把501房间和502房间的家具家电进行交换,那你也太傻了。简单的做法是,让甲乙二人交换一下房间钥匙就好了。

8、思考,指针本身是int值,表示一个地址,那么问题来,不同类型的指针到底有什么区别呢?

  表示方法和内容没有区别,只是表明,指向不同的类型。这其实告诉编译器,应该怎么样去解释这个地址的内存大小和布局。也就是说,告诉编译器,把它指向的内容当作什么类型来看待。

原文地址:https://www.cnblogs.com/nzbbody/p/3546441.html