标签:
一、指针与引用的定义及特性
A、引用(reference):为一个已经存在的对象另起一个名字。它有以下特性:
1.必须初始化
2.始终指向同一个对象,不能更改其所指向的对象
3.自身只是一个别名,不占内存,对其取地址是其指向对象的地址
4.常量引用的意义在于不能通过引用来修改其所指向对象的值,其所指对象可以不是常量
int tempA = 2; const int ctempA = 2; /*1.正常使用*/ int &refA = tempA; const int &crefA = ctempA; /*2.常量引用可以指向普通对象*/ const int &crefB = tempA; /*3.引用的地址是所指对象的地址,三者相同*/ cout<<"&tempA = "<<&tempA<<endl; cout<<"&refA = "<<&refA<<endl; cout<<"&crefB = "<<&crefB<<endl; /*4.crefC指向一个临时对象,其对象被引用接管了*/ const int&crefC = 3; /*5.没有临时对象产生,编译不过*/ int &refC = 3; /*6.没有进行初始化,编译不过*/ int &refB; /*7.普通引用不能指向常对象,编译不过*/ int &refD = ctempA;
B、指针(pointer):一个普通变量,其内容为一块地址。引用相比它有以下特性:
1.可以不被初始化
2.生命周期里可以更改所指向的地址
3.自身也是一个对象,自己占一块内存,对其取地址得到其所占内存的地址
4.指针的常量性分为:顶层const(指针本身是个常量)和底层const(指针所指的对象是一个常量)
int tempA = 2; const int ctempA = 2; /*1.下列定义分别为:普通指针、顶层const指针、底层const指针和const指针*/ int *ptrA; int * const topLevelConstPtrA = &tempA; const int *lowLevelConstPtrA; const int * const constPtrA = &ctempA; /*2.使用过程中对其赋值*/ ptrA = &tempA; /*3.三者一样,指针保存着所指对象的地址*/ cout<<"&tempA = "<<&tempA<<endl; cout<<"ptrA = "<<ptrA<<endl; cout<<"topLevelConstPtrA = "<<topLevelConstPtrA<<endl; /*4.三者不一样,指针有自己的内存*/ cout<<"&tempA = "<<&tempA<<endl; cout<<"&ptrA = "<<&ptrA<<endl; cout<<"&topLevelConstPtrA = "<<&topLevelConstPtrA<<endl;
二、指针与引用的个人理解
1.唯一的共同使用场景是在函数参数传递中,为了避免拷贝构造带来的性能影响或者不能进行拷贝,这时就需要进行传引用或者传指针来代替。
2.优先使用引用,引用使用起来更直接和简单;
3.指针功能更强大,但是也更容易用错,底层const顶层const就能让一些人犯晕。
4.确定不改变其传入参数时,请加上const,传入const引用或底层const
5.有指向指针的引用,但是没有指向引用的指针(引用自身不占内存)
6.存在数组的引用,但是没有引用的数组
标签:
原文地址:http://www.cnblogs.com/cauchy007/p/4965155.html