引用(reference)
引用是C++对c的扩充,引用是一种新的变量类型,它的作用就是给变量起一个别名。
额外的话题:
堆:malloc创建空间,空间是没有名字的,要使用这个空间需要用指针。
栈:空间有名字。
数据段:有的没名字如字符串常量,有的有名字如全局变量。
所以要使用内存空间两个方法,一个使用名字,一个使用指针。
= 号前面的是引用符, =号后面的是取地址符。99.5%都对。
图中&就是引用符,这样a的别名就是b,也就是a就是b,b就是a。
引用类型变量不会开辟空间。
例子
#include <iostream>
using namespace std;
void f1() {
int a = 20;
int &b = a;//创建引用类型变量时,要立刻 "赋值"
int c = 100;
b = c;
cout<<b<<endl;//100
cout<<a<<endl;//100
cout<<&a<<endl;//0xbfbd393c
cout<<&b<<endl;//0xbfbd393c
}
void f2(int *p) {
*p = 21;
}
void f3(int &r) {//int &r = age
r = 22; //age=22
}
/**
* (1)引用是变量的别名, 不会再开辟空间
* (2)引用在实计开发中,只使用于函数的形式参数,就类似于f3()。
* (3)比喻:引用是一种受限指针,引用能做的事指针都能做,而指针能做事引用不一定能用。
* (4)引用的底层实现在多数编译器中也是指针.但在上层上当作没开辟空间,
*/
int main() {
// f1();
int age = 20;
//调用函数,让age的值改变为21
f2(&age);
cout<<"age="<<age<<endl;//age=21
//调用函数,让age的值改变为22; 但是不能使用指针
f3(age);
cout<<"age="<<age<<endl;//age=22
return 0;
}
为什么要起个别名,而不直接就用它原来的名字,这不搞复杂了吗?
看上面的代码,如果让age从20变为21,调用函数的话(f2),C中可以用指针.
而当不用指针的时候,C++就可以用引用,f3这个函数。
从功能上说,两种都是一样的。
但从内存分配上来说,引用就会快一些,它不会额外的开辟空间。