文章目录
- 1、引用的定义和使用
- 2、引用的本质
- 3、引用作为函数参数
- 引用的地址
1、引用的定义和使用
#include<iostream>intmain(){intx=10;int&a=x;int&b=x;a=11;b=12;std::cout<<x<<std::endl;//12std::cout<<a<<std::endl;//12std::cout<<b<<std::endl;//12std::cout<<"Hello World!\n";}语法是:类型& 变量名=值
- a、b都是x的引用,是x的别名。
对a、b、x任一的修改都是修改同一个地址的值,即变量x的值。 - 创建引用变量a、b时,必须赋值(初始化)。
- a、b初始化后,永远是x的引用,无法再改变为其他变量的引用。
- 不存在NULL引用。一定是具有合法地址的变量的引用。
2、引用的本质
本质是指针。只是编译器层面的语法处理,编译后会变成指针的写法。
intx=1;int&a=x;//编译器处理为:int * const aref = &x;a=10;//编译器处理为:*aref = 10;//其中aref是编译器起的名字,用户不可知。本质是处理成指针常量/常指针。就是指向初始化后不能改变的指针。
所以一个引用在内存中是占用8个字节存储(就是按指针的存储):
#include<iostream>classPerson{int&a;int&b;};intmain(){//通过sizeof获取Person数据类型占用的内存空间std::cout<<sizeof(Person)<<std::endl;//16}有时编译器会将引用优化掉,完全用所引用的变量,不会额外创建指针常量。
3、引用作为函数参数
#include<iostream>voidadd(int&a){a++;}intmain(){intx=1;add(x);std::cout<<x<<std::endl;//2}引用作为函数参数时,相当于传的是实参的指针,也就能在函数中通过改变形参来改变实参的值。
在一些场景代替指针,具有更好的可读性和实用性。
引用的地址
#include<iostream>intmain(){intx=10;int&a=x;int&b=x;a=11;b=12;std::cout<<&x<<std::endl;std::cout<<&a<<std::endl;std::cout<<&b<<std::endl;std::cout<<"Hello World!\n";}用&获取引用的地址,并不是获得编译器内部分配的指针常量的地址,而是编译器将&a处理为返回所引用的x的地址。
所以&a和&x的值相同,都是x的地址。