c++中的引用

一、对变量的引用

语法:①&和别名结合 表示引用

②给某个变量取别名,就定义某个变量

③从上往下替换

int num = 10;
int &a = num; //此处&不是取地址,而是标明,a是引用变量,即a是num的别名

注意:引用必须要有初始化;引用一旦初始化后,就不能修改别名。

int a = 10;
int &b = a;
cout << "a = " << a << endl;
b = 100;
cout << "a = " << a << endl;

cout << "a的地址 = " << &a << endl;
cout << "b的地址 = " << &b << endl;

二、对数组的引用

法1、

int arr[5] = {0, 1, 2, 3, 4};
int (&myarr)[5] = arr;

int i = 0;
for(; i < 5; i++){
    cout << myarr[i] << " ";
}
cout << endl;

法2、

typedef int TYPE_ARR[5];

TYPE_ARR &myArr = arr;

for(i = 0; i < 5; i++){
    cout << myArr[i] << " ";
}
cout << endl;

三、引用作为函数的参数

void swap01(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void swap02(int &a, int &b){ //函数的引用
    int tmp = a;
    a = b;
    b = tmp;
}

void test02(){
    int data1 = 10;
    int data2 = 20;
    cout << "data1 = " << data1 << ", data2 = " << data2 << endl;
    //swap01(&data1, &data2); // 成功交换
    swap02(data1, data2);
    cout << "data1 = " << data1 << ", data2 = " << data2 << endl;
}

四、引用作为函数的返回值

//引用作为函数的返回值类型
int& myData(void){
    int num = 100;
    return num; //函数返回值是啥变量, 引用就是该变量的别名
    //函数的返回值是引用时 不要返回局部变量
}

int& myData1(void){
    static int num1 = 200;
    return num1;
}

void test03(){
    //ret是函数返回值的别名
    //int &ret = myData();
    //cout << "return = "<< ret << endl;
    int &ret1 = myData1();
    cout << "return = "<< ret1 << endl;
}

当函数的返回值作为左值,那么函数的返回值类型必须是引用

int& myData2(void){
    static int num = 10; //static变量只会赋值一次
    cout << "num = " << num<<endl;
    return num;
}

void test04(){
    //函数的返回值作为左值
    myData2() = 2000;

    myData2();
}

五、引用的本质

引用的本质是在c++内部实现的一个指针常量。Type& ref = val; // Type* const ref = &val; c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是在编译器内部实现的,用户不可见。

六、指针的引用

void my_str(char* &str1){
    str1 = (char *)calloc(1, 32); //为str1申请空间
    strcpy(str1, "hello world!");
    return;
}

void test05(){

    char* str = NULL;
    my_str(str);
    cout << "str = " << str << endl;
    free(str);
}

七、常引用

1.引导出常引用

typedef struct{
    int num;
    char name[32];
} STU;

void myPrintSTU(const STU &tmp){
    cout << "num = " << tmp.num << ", name = " << tmp.name << endl;
}

void test06(){
    STU lucy = {10, "lucy"};

    myPrintSTU(lucy);
}

普通结构体变量作为形参,开销太大;采用常引用以空间换时间,可以提高运算效率

2.常量的引用

void test01()
{
    //给常量10取个别名 num
    //int &针对的是int, 而10是const int类型
    // const int针对的是const int, 10是const int 类型
    const int &num = 10;

    cout << "num = " << num << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值