引用的基本语法

& 符号写在左侧是引用,写在右侧是取地址

  1. 引用基本语法 Type &alias = OriginalName
  2. 引用必须初始化
void test(){
    int a = 10;
    int &b = a;
    cout << b << endl;
}

int main() {
    test();
    return 0;
}
  1. 引用初始化后不可以修改
  2. 对数组建立引用
void test2(){
    int arr[10];//创建1-10的数组
    for (int i = 0; i < 10; ++i) {
        arr[i] = i;
    }
    //第1种方式
    int(&parr)[10] = arr;
    for (int j = 0; j < 10; ++j) {
        cout << parr[j] <<endl;
    }

    //第2种方式:起别名
    typedef int(ARRAY)[10];//ARRAY是具有10个元素的int类型的数组
    ARRAY &parr2 = arr;
    for (int j = 0; j < 10; ++j) {
        cout << parr2[j] <<endl;
    }
}

int main() {
//    test();
    test2();
    return 0;
}

引用的注意事项

  1. 引用必须引用一块合法的内存空间
int &a = 10;//10不是变量,没有内存空间
  1. 不要返回局部变量的引用
int& doWork(){
    int a1 = 10;
    return a1;
}

void test3(){
    //此时接收局部变量的引用,但局部变量在函数结束后会销毁
    //部分编译器在第1次打印时会做优化,接下来的打印会出现乱码
	//解决方案时加static关键字
    //int &dw = doWork();
	static int &dw = doWork();
    cout << dw << endl;
}

int main() {
//    test();
//    test2();
    test3();
    return 0;
}
  1. ==如果一个函数返回值是引用,那么返回值可以当左值==
int& doWork(){
    static int a1 = 10;
    return a1;
}

void test4(){
    doWork() = 1000;
    //相当于a=1000
}

参数传递

上面演示了引用传递,下面是值传递和引用传递的代码

  • 值传递 ==这样的值传递不能起到交换元素的作用,解决方案有传递数组和数组的2个索引,或者用地址传递,或者麻烦一些,就写返回值==
void swap(int a,int b){
    int tmp = a;
    a = b;
    b = tmp;
}

int main() {
    int a = 10;
    int b = 20;
    swap(a,b);
    cout << a << b << endl;
    return 0;
}
  • 地址传递 ==地址传递直接修改了内存,所以会直接修改值==
void swap2(int* a,int* b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main() {
    int a = 10;
    int b = 20;
    swap2(&a,&b);
    cout << a << b << endl;
    return 0;
}
  • 引用传递 ==类似于传递地址,接收到的是变量的引用,也是直接修改的内存
void swap3(int &a,int &b){
    int tmp = a;
    a = b;
    b = tmp;
}

int main() {
    int a = 10;
    int b = 20;
    swap3(a,b);
    cout << a << b << endl;
    return 0;
}

指针和引用的区别

==引用的本质就是指针常量==

int main() {
    int a = 10;
    int& b = a;//自动转换为int* const b = &a;
    //还可以这么记,双地址就是指针,这就说明了为什么引用必须初始化
    return 0;
}

==下面这两行代码,定义了一个整形变量i和一个指针变量p,该指针变量指向a的存储单元,即p的值是i存储单元的地址==

    int i = 1;
    int *p = &a;

image.png ==下面这两行代码,定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元==

    int a = 1;
    int &b = a;