![2a7254e1a28d0d981a7fbfb327d9bfa2.png](https://i-blog.csdnimg.cn/blog_migrate/3d4a2d88227b64621b97545ebaf81c3a.jpeg)
导图
![408251e93e961a8b11e0aca598b95fb4.png](https://i-blog.csdnimg.cn/blog_migrate/9bb27f3351335f942481fdea8d5b3c35.jpeg)
引用
- what is 引用?
翔曰:“引用者,绰号也。” 哈哈哈,话粗理不粗,人(变量)只有一个,但是绰号可以很多。官方解释引用是变量的别名,不是实体类型【注释1】。它长这样子:
int a = 94;
int &b = a;//引用必须初始化 - 引用从何而来?
众所周知,c++从某一方面来说是c的威力加强版,因此在设计之初,c++委员会既想保留c指针的高效性,又想避开对指针操作不慎带来的bug,于是引入了引用 这一概念想要取代指针操作,却发现指针太牛掰了,根本取代不了,引用也有了其他的用途(伟大的发现总是不经意间诞生的是吧,比如“某哥”)。 - 引用在哪使用?
- 从函数中返回引用时,一定要保证在函数返回以后,被引用的目标一直有效,也就是不能返回局部变量的引用,因为一旦函数返回,局部变量都会被析构。
int& func(int a); - 使用引用作为形参,那么形参和实参就是同一个对象,也就不存在对象的复制,避免了复制的开销(划重点!);
- 修改形参也就相当于修改实参。
- 实际利用的比较多的是优势是避免开销。
int func(int &a);
- 从函数中返回引用时,一定要保证在函数返回以后,被引用的目标一直有效,也就是不能返回局部变量的引用,因为一旦函数返回,局部变量都会被析构。
- 引用型形参 :
- 引用型 返回值 :
- 注意
- 引用必须初始化(作为形参时,但传入实参时初始化);
- 引用不能更换目标,比如:
int a = 94;
int c = 95;
int &b = a;
b = c;//错误,引用不能更改目标
指针
- what is 指针?
翔曰:“指针者,一曰实体,二曰数据类型。” 指针作为实体时,是用来保存一个内存地址的变量 ;作为数据类型时,指针类型描述了一种对象,其值为对被引用类型实体的引用。没错,这是百度百科上说的官解,看完我也一脸懵逼,怎么理解呢?其实就是:
int a = 94;
int* pa = &a;//"&"在这里是取地址符,不是引用
对于上述代码,pa就是实体,int*就是数据类型。对于一个指针实体而言,我们主要考察“指针类型(也就是数据类型)”、“指针所指向的类型”、“指针的值”、“指针本身所占的内存区大小”。 - 指针的值
指针的值是指指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值,比如:
int* pa = (int*)1;
这里pa的值就是1(一般写作0x1,因为是地址),当编译器解析pa时,不会直接取出1就直接用,而是拿着它去找索引为1的那一块内存【注释2】,取出这块内存中的值来使用。 - 指针所指向的类型
例如:
int a = 94;
int* pa = &a;
这里pa指向的类型就是int。(也就是说,从右往左,指针所指的类型就是消去一个"*"后所剩的部分。 - 指针本身所占据的内存区大小
在任何机器上(64bit or 32bit)使用sizeof()即可查看指针的大小:
int a = 94;
double b = 94.0;
complex c;
int* pa = &a;
double* pb = &b;
complex* pc = &c;
//下述输出均在32bit机器上
cout << sizeof(pa) << endl;//输出 4
cout << sizeof(pb) << endl;//输出 4
cout << sizeof(pc) << endl;//输出 4
由上可知,不论指针指向的类型是啥,指针本身的大小都是4字节。也就是说指针的大小与指向的类型无关。那为什么会是4字节呢?思考一下【注释3】。 - 其他
理解了指针上面这四个地方,其他的都是弟弟哈哈哈哈、
指针与引用的区别
- 存在空指针,不存在空引用;
void* p = NULL;//空指针,合法
void& r = NULL;//空引用,不合法 - 指针可以不初始化(有的编译器会警告),引用不可以不初始化;
- 存在指针数组,但不存在引用数组。
int* parr[3] = {&x, &y, &z};//指针数组,合法
int& rarr[3] = {x, y, z};//引用数组,不合法
总结
- 在c++底层中,引用是通过指针实现的,也就是说,在实现层面,引用就是指针,但在语言层面,引用不是实体类型;
- 我们通常所说的指针是实体;
- 指针就类似于你对象的门牌号,知道了门牌号才能去提亲是吧~;
- 微信后台发送131获取注释内容;
- 最后喜欢我的文章请点赞关注加收藏,谢谢~。
![5c2febf85bd0ae7764670f1a575510e4.png](https://i-blog.csdnimg.cn/blog_migrate/6c7bfcf2eca6c8bb06df28a4dcdc5c76.png)