本质:给变量起别名
必须初始化,初始化完不可以改变。
优点:简化指针修改实参!非常有用,降低了指针的难度
#include<iostream> using namespace std; // 1.值传递 void mySwap01(int a, int b) { int temp = a; a = b; b = temp; } // 2.地址传递 void mySwap02(int* a, int* b) // 指针接收地址 { int temp = *a; *a = *b; *b = temp; } // 3.引用传递 void mySwap03(int& a, int& b) // 本质:别名 { int temp = a; a = b; b = temp; } int main() { int a = 10; int b = 20; mySwap01(a, b); // 值传递,形参不会修饰实参 mySwap02(&a, &b); // 地址传递,形参会修饰实参 mySwap03(a, b); // 引用传递,形参也会修饰实参 return 0; }
#include<iostream> using namespace std; // 引用做函数的返回值 // 不要返回局部变量的引用 int& test01() // 引用方式返回 { int a = 10; // 局部变量存放在栈区 return a; } // 函数的调用可以作为左值 int& test02() { static int a = 10; // 静态变量,存放在全局区,数据在程序结束后系统释放 return a; } int main() { //int& ref = test01(); //cout << "ref = " << ref << endl; // 第一次打印是正确的,因为编译器做了保留 //cout << "ref = " << ref << endl; // 第二次结果是错误的,因为a的内存已经释放 int& ref2 = test02(); // 本身就是a的别名 cout << "ref2 = " << ref2 << endl; // 因为是静态变量 cout << "ref2 = " << ref2 << endl; test02() = 1000; // 因为函数调用返回的是一个引用,这个函数调用可以作为左值 a = 1000 cout << "ref2 = " << ref2 << endl; cout << "ref2 = " << ref2 << endl; return 0; }
指针常量:指针指向不能改变
引用的本质就是一个指针常量!
这也就是为什么一旦初始化不可以发生改变的原因。