引用和指针

1.引用的概念及其基本应用

  • 什么是引用

    引用引入了对象的一个同义词,它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。

  • 引用定义的格式为:
    类型 & 引用变量名 = 已定义过的变量名

  • 引用的特点
    一个变量可取多个别名;
    引用必须初始化;
    引用只能在初始化时引用一次,不能改变为再引用其他的变量。

例:

1>引用:

    int a = 2;  //定义一个变量a
    int &b = a; //为a引用一个别名b

    cout << "a.address->" << &a << endl;  //输出a的地址
    cout << "b.address->" << &b << endl;  //输出b的地址

这里写图片描述

    a = 3;  //改变a的值,输出查看 a 和 b 的值

    cout << "a: " << a << endl;
    cout << "b: " << b << endl;

    b = 5;  //改变 b 的值,输出查看 a 和 b 的值

    cout << "a: " << a << endl;
    cout << "b: " << b << endl;

这里写图片描述

    b = 4;
    int& c = b;  //引用一个引用变量,别名的别名
    c = 4;

    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    cout << "c:" << c << endl;

这里写图片描述
这里说明在用引用时会因为任何一个变量名称内容改变时,其余的也都会改变。怎么样可以改变这种情况呢?我们使用const引用。

例:
2>const 引用:

    int a1 = 2;
    const int& a2 = a1;
    a1 = 5; //a1改变,a2的值也会改变

    cout << "a1:" << a1 <<endl;
    cout << "a2:" << a2 << endl;

这里写图片描述
若改变a2 的值,则会报错:
这里写图片描述
这是因为d2为const引用,不能给常量(不能修改的量)赋值。但常引用可以引用常量。
例:

    const int a3 = 3;
    const int a4 = a3;
    const int &a6 = 4;   //常量具有常性,只有常引用可以引用常量

还有一种情况,如下:
这里写图片描述
这里报错是因为:a7是double类型,a8是int类型,a7赋值给a8时要生成一个临时变量,a8引用的时这个带有常性的临时变量,所以不能赋值。
所以将引用改为const引用

    double a7 = 3.33;
    const int& a8 = a7;
    cout << "a8: " << a8 << endl;

这里写图片描述

3>引用作为参数
例:

void Swap(int &left, int &right)
{
    int tmp = left;
    left = right;
    right = tmp;
}
int mainI()
{
int a = 6;
    int b = 8;
    cout << "a: " << a << "  b:" << b << endl;
    Swap(a, b);
    cout << "Swap(a, b):" << endl;
    cout<<"a:" << a << "   b : " << b << endl;
    return 0;
}

这里写图片描述
在这里应用引用传参,也修改了实参,此时,形参是实参的别名,没有另外开辟空间。用传地址的方式传参也可以起到修改实参的作用,但此时形参需额外开辟空间。

当不希望函数内改变参数的值时,尽量使用常引用传参。

4>传引用作为返回值
a)传值返回

int Add(int d1, int d2)     //传值返回
{
    int ret = d1 + d2;
    return ret;
}

int main()
{
    int a = 6;
    int b = 8;
    int c = Add(a, b);
    cout << "a +b = " << c << endl;
    return 0;
}

这里写图片描述

如果用int &c = Add(a,b);程序会报错,因为函数的返回值为临时变量,具有常性,应用conct修饰为:const int& c = Add(a,b);.
b)传引用返回

int& Add(int d1, int d2)     //传引用返回
{
    int ret = d1 + d2;
    return ret;
}

int main()
{
    int a = 6;
    int b = 8;
    int& c = Add(a, b);
    cout << "a +b = " << c << endl;
    Add(1,2);
    return 0;
}

这里写图片描述
c)通过汇编查看传值返回和传引用返回:
这里写图片描述
结论:

  1. 不要返回一个临时变量的引用。
  2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。

引用和指针的区别联系

  1. 引用只能在定义时初始化一次,之后不能改变指向其他变量(从一而终),指针变量的值可变。
  2. 引用必须指向有效的变量,指针可以为空。
  3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
  4. 指针和引用的自增(++)、自减(–)意义不一样。指针的++ 加的是类型的大小,而引用的++是变量的++;–类似。
  5. 相对而言,引用比指针更安全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的引用指针有一些区别。下面是它们的主要区别: 1. 语法区别:在C语言中,引用使用&符号来获取变量的地址,而指针使用*符号来声明指针变量和解引用指针。 例如: ```c int num = 10; int *p = &num; // 使用指针获取变量的地址 int &ref = num; // 使用引用获取变量的地址 ``` 2. 操作区别:通过指针可以进行指针运算和修改指针所指向的值,而引用只能在创建时绑定到一个对象,之后无法改变绑定的对象。 例如: ```c int num = 10; int *p = &num; int &ref = num; *p = 20; // 修改指针所指向的值 ref = 30; // 修改引用所绑定的值 p++; // 指针运算 // ref++; // 错误,引用无法修改绑定对象 ``` 3. 空指针和野指针指针可以具有空值(NULL),即未指向任何有效对象。而引用必须始终引用一个有效对象,没有空引用的概念。 例如: ```c int *p = NULL; // 空指针 // int &ref; // 错误,引用必须初始化绑定到一个对象 ``` 4. 传递方式:通过指针传递参数时,可以修改原始数据。而通过引用传递参数时,可以直接修改原始数据,但不能重新绑定到其他对象。 例如: ```c void modifyByPointer(int *p) { *p = 100; } void modifyByReference(int &ref) { ref = 200; } int num = 10; modifyByPointer(&num); // 通过指针修改原始数据 modifyByReference(num); // 通过引用修改原始数据 ``` 总体而言,指针提供了更多的灵活性和功能,可以进行指针运算和动态内存分配等操作。而引用更加简洁、直观,适用于简单的传递参数和别名的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值