C++引用与指针

    xiaoxiao2021-03-25  130

    C++一开始接触到的就是引用这个概念。初次接触,对引用现在有了一定的了解。

    引用(reference):某一变量的别名。

    我们现在所了解到的引用主要是左值引用,除此之外还有右值引用。借此机会,我也了解了一下左值与右值的区别。

    左值:必须在内存中存在实体(++a是左值引用) 右值:存放在寄存器、cpu中(a++是右值引用) 区分二者最简单的方法就是看能否取地址,左值可以取地址而右值不可以。

    int a = 10; int &ra = a;

    上面的代码块便是引用的格式:类型 &引用变量名=已定义过的变量名; ra便是a的引用,也就是说,ra是a的别名,两者的作用相同。 对a进行操作与对ra进行操作结果完全相同。二者具有相同的地址。

    引用的注意事项:

    1.一个变量可以取多个别名 2.引用必须初始化且只能初始化一次,不能再改为其他变量的引用 3.加上const的引用更加安全 4.可以把引用绑定到const对象上,称作对常量的引用,但是不能通过对常量的引用来修改它所绑定的对象。 5.不能建立void类型的引用 6.可以用常量或者表达式对引用进行初始化,但必须是const引用 7.包含隐式类型转换

    float d = 12.34int &rd = d;//d是double类型,rd是int类型,d赋给rd时会产生一个临时变量,也就是说rd会引用这个具有常性的临时变量,所以不能赋值。

    数组的引用

    int a[10] = { 0 }; int(&ra)[10] = a;

    二维数组

    int a[3][4] = { 0 }; int(&ra)[3][4] = a;

    引用作为函数参数

    例如:交换两个整形常量

    void swap(int &a,int &b) { int tmp = a ; int a = b; int b = tmp; } int main() { int a = 10; int b = 20; swap(a, b); return 0; }

    若采用传值调用,占用空间大还无法交换二者的值。 若采用传址调用,指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不需要单独占内存单元,它是实参的别名。 引用调用的效率比以上二者的效率都要高。

    若不希望函数调用过程中改变实参的值,可在引用前加const限定。

    引用作为返回值

    int &Add(const int & a, const int & b) { int ret = 0; ret = a + b ; return ret; }

    ret是个临时变量,函数结束便销毁了,此处函数返回一个临时变量,必然会出错。 要返回一个出了函数作用于的对象的引用。

    指针和引用的区别

    1.引用只能在定义时初始化一次 ,之后再不能与其他变量绑定。指针变量的值可变。 2.引用必须指向有效的变量,而指针可以为空。 3.sizeof在求取指针对象和引用对象的值不同,sizeof引用得到的是所引用对象的大小,sizeof指针得到的是对象的地址大小。 4.引用时(++)和(–)相当于给变量自增自减,给指针进行自增自减则会改变指针的指向。 5.相对而言引用比指针更加安全。

    右值引用

    int num = 20; int *&&rpnum = #

    此处&num就是右值。因为右值是在寄存器上的,如果我们要把他拿出来,需要进行拷贝,早期的c++采用的就是在内存开辟一块空间进行拷贝,然后进行操作,但是这样的话太浪费空间与时间。 右值引用很好的节省了空间与时间。

    转载请注明原文地址: https://ju.6miu.com/read-7776.html

    最新回复(0)