"&"不是取地址运算符,而是声明引用的标记
引用条件: 1、函数参数或返回值
2、已定义的变量,不能是常量或表达式
不为引用分配额外内存空间,与变量占同一段内存
不能建立 void引用、引用的引用、指向引用的指针、引用数组
#include <iostream> using namespace std; int x = 5,y = 10; int& r = x; void print() { cout << "x=" << x << " y=" << y << " r=" << r << endl; cout << "x的地址>>" << &x << endl; //输出的是内存地址 cout << "y的地址>>" << &y << endl; cout << "r的地址>>" << &r << endl; } int main() { print(); cout << endl; r = y; print(); cout << endl; y = 100; x = y - 10; print(); cout << endl; return 0; }
引用作为形式参数
引用作为形式参数
不能在形参表中初始化,而由调用的实参完成
引用使实参变量的作用域扩大到原先无法进入的被调函数中
对引用的任何操作实际上就是对对应实参的操作
#include <iostream> #include <string> using namespace std; void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } void printout(int a, int b) { cout << "a=" << a << "b=" << b << endl; } int main() { int a = 1, b = 3, c = 5, d = 7; swap(a, b); printout(a, b); swap(c, d); printout(c, d); return 0; }
常引用
//用法 int Fun(const int &x,int &y,int &z); //一旦修改常引用形参,就会报错 //常引用可以保护对应实参不被修改
引用和指针的比较
- 引用无需指针(间接)运算符*,而指针一定要使用,使用引用简化程序
- 调用时,与引用形参对应的实参使变量名,而与指针形参对应的实参是变量的地址
- 引用形参不另外占用空间,但指针形参要额外占用空间
- 引用无法完全取代指针,指针有更灵活广泛的用法
无法替代指针的情况
- 指针与数组对应(指针形参对应数组实参)
- 链表(指针+结构体)
- 动态空间
- 指针数组、行指针变量、多级指针、函数指针
引用作为返回值
作为独立函数调用语句使用,忽略返回值,相当于 void 返回
使用函数的返回值
作为左值调用
#include <iostream> #include <string> using namespace std; int& Fun(const int& x, int& y, int z) { y++; z++; return y; } int main() { int a = 1, b = 2, c = 3, d = 0; cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << endl; Fun(a, b, c); //方法一 cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << endl; d = Fun(a, b, c); //方法二 cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << endl; Fun(a, b, c) = 100; //方法三,return 的是b的别名 cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << endl; return 0; }
return 后面只能是变量(引用也可以看成特殊变量)
自动局部变量不能作为引用返回(return后面变量的内存空间在本次函数调用结束后应当仍然存在)
return 后面返回的值不能是常引用