一,引用
为对象起了另一个名字,引用类型引用另外一种类型
int a = 10;
int &b = a; //b指向a(是a的另一个名字)
int &c; //错误:引用必须被初始化
一般初始化变量时,初始值会被拷贝到新建的对象中。但是定义引用,只是把引用和他的初始值绑定到一块,并不是拷贝给引用。一旦初始化完成,则和初始值对象一直绑定到一起,无法重新绑定另一个对象
引用即别名
- 引用并非是对象,他只是为一个已经存在的对象所起的另外一个名字
- 因为引用并不是一个对象,所以不能定义引用的引用: 即不能这样定义:int& (&d);此时&b不是一个对象
int a = 10;
int &b = a; //b是a的引用
b = 20; //此时a的值变为c,引用绑定后,所有操作都是在绑定的对象上进行的
int d = b; //以引用作为初始值,实际上是以引用绑定的对象作为初始值
引用的定义
每个开头都必须以&开头
int a = 10;
int &b = a; //b是a的引用
int &c = b; //c也是a的引用
int &aa = 10; //错误,因为引用类型的初始值必须是一个对象
二,指针
指针本身就是一个对象,可以进行赋值和拷贝;无需在定义时赋初值
int a, aa;
int *b = &a; //b存放a的地址,b是a的指针
b = &aa; //可以重新指向
double *c = &a; //错误,需要类型相同
int *d; //定义时不用赋初值
指针值
- 指向一个对象
- 指向紧邻对象所占空间的下一个位置
- 空指针,意味着指针没有指向任何对象
- 无效指针,也就是上述情况之外的其他值
如果指针指向了一个对象,则允许使用解引用符(*)来访问该对象
int a = 10;
int *b = &a;
cout << *b << endl; //使用解引用符号
解引用符号仅适用于哪些确实指向了某个对象的有效指针
空指针
int *a = 0;
int *b = NULL; //需要加#include<cstdlib>头文件
int *c = nullptr; //C++11新标准刚引用的一种方法,尽量使用这一种方法
三,关键
&和*符号既能够做表达式,既能作表达式里的运算符,也能作为声明的一部分出现,符号的上下文决定了符号的意义
int a = 10;
int &b = a; //&紧随类型名出现,因此是声明的一部分,b是一个引用
int *c; //*紧随类型名出现,因此时声明的一部分,c是一个指针
c = &a; //&出现在表达式中,是一个取地址符
cout << *c << endl; //解引用符
*c = a; //*出现在表达式中,是一个解引用符
cout << *c << endl; //解引用符
int &d = *c; //&是引用,*是解引用符
cout << d << endl; //此时d是*c的别名
int *c;
int &d = *c; 这个地方我的理解是d是*c的别名,不知道对不对,有其它意见可以下面评论
下面再给一个例子帮你理解指针的指向
eg:
int i = 10;
int *pi = 0; //pi被初始化,但没有被指向任何对象
int *pi2 = *i; //pi2被初始化,存有i的地址
int *pi3; //如果pi3定义于块内,则pi3的值是无法确定的
pi3 = pi2; //pi2和pi3指向同一个对象i
pi2 = 0; //现在pi2是空指针,不知向任何对象