引用的基本概念
变量名实质上是一段连续存储空间的别名,例如房间的门牌号,程序通过变量来申请并命名内存空并使用存储空间
引用可以看作一个已定义变量的别名
引用的语法:
type &name = var
int b=10;
int &a=b;
引用的使用:
void main1()
{
int a = 2018;
int &b = a;
b = 2019;
printf("b:%d\n",b);
printf("a:%d\n", a);
printf("&a:%d\n",&a);
printf("&b:%d\n",&b);
}
//程序输出:
b:2019
a:2019
&a:6422296
&b:6422296
由程序输出可见:b是a的引用,更新b也同时更新了a的值,因为a,b均指向统一内存空间。
引用的本质
因为引用必须要初始化,故引用类似于一个const
int &a=b;<=====>int * const a=&b;
即引用在C++中的内部实现是一个常指针,故引用占据的内存空间大小与指针相同:4字节
故虽然引用是别名,但是仍然有自己的存储空间
====>因此在编译的时候,编译器自动帮助我们对实际参数b取地址传给了常量指针a-即形参引用
引用的使用
引用做左值
当函数返回值为引用时
若返回栈变量
不能成为其它引用的初始值
不能作为左值使用
若返回静态变量或全局变量
可以成为其他引用的初始值
即可作为右值使用,也可作为左值使用
返回值是static做引用-代码实例:
int test1()
{
static int a = 10;
a ++;
printf("a:%d \n", a);
return a;
}
int& test2()
{
static int a = 10;
a ++;
printf("a:%d \n", a);
return a;
}
int *test3()
{
static int a = 10;
a ++;
printf("a:%d \n", a);
return &a;
}
int main()
{
// test1()的运算结果是一个数值,没有内存地址,不能当左值
//当被调用的函数当左值的时候,必须返回一个引用
test2() = 100; //编译器实现做左值条件
test2();
*(test3()) = 200; //自己实现做左值的条件
test3();
return 0;
}
程序结果:
a:11
a:101
a:11
a:201
返回值是形式参数做引用-代码实例:
int& test(int *p)
{
*p = 100;
return *p;
}
int main()
{
int a=10;
//使用引用去接收函数的返回值,看返回的内存空间是否被编译器释放
//这里:a的地址与test(&a)的地址时一样的,故还没有释放,可以做引用的右值
int &b=test(&a);
return 0;
}
返回值是其他复杂类型做引用:========>以后更新
指针的引用-代码示例:
struct Teacher
{
char name[64];
int age;
};
int getTe(Teacher **myp )
{
Teacher *p=NULL;
p = (Teacher *)malloc(sizeof(Teacher));
if (p ==NULL)
{
return -1;
}
p->age = 33;
*myp = p;
return 0;
}
int main()
{
Teacher *p1 = NULL;
getTe(&p1);
printf("age:%d \n", p1->age);
return 0;
}
以上函数的内存执行图:
指针引用:
int getTe2(Teacher* &myp)
{
myp = (Teacher *)malloc(sizeof(Teacher));
myp->age = 34;
return 0;
}
常引用-代码示例:让变量引用具有只读属性
//普通引用
int a = 10;
int &b = a;
//常量引用 :让变量引用只读属性
const int &c = a;
//常量引用初始化 分为两种
//1 用变量 初始化 常量引用
int x = 20;
const int& y = x;
//2 用常量 初始化 常量引用
//int &m = 10; //引用是内存空间的别名 字面量10没有内存空间 没有方法做引用
const int &m = 10;
常引用总结:
1)Const & int e 相当于 const int * const e
2)普通引用 相当于 int *const e1
3)当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
4)使用字面量对const引用初始化后,将生成一个只读变量