zoukankan      html  css  js  c++  java
  • C++ 引用和指针

    参数传递的本质是什么?

    参数的传递本质上是一次赋值的过程,赋值 <---> 对内存进行拷贝 <---> 将一块内存上的数据复制到另一块内存上

    C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制。

    引用是什么?

    引用可以看作是数据的一个别名,同个这个别名和原来的名字都能找到这份数据。

    引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其他数据,这有点类似于const变量(常量)。

    #include <iostream>
    using namespace std;
    int main() {
        int a = 99;
        int &r = a;
        cout << a << ", " << r << endl;
        cout << &a << ", " << &r << endl;
        return 0;
    }
    
    /*运行结果:*/
    99, 99
    0x6ffe04, 0x6ffe04
    

    由于引用和原始变量都指向同一地址,所以通过引用也可以修改原始变量中所存储的数据。如何限制通过引用修改原始的数据?

    可以在定义时添加const限制,const int &r = a; 或者 int const &r = a;

    引用作为函数参数

    在定义或声明函数时,可以将函数的形参指定为引用的形式,这样可以在函数内部影响函数外部数据。

    引用作为函数返回值

    #include <iostream>
    using namespace std;
    int &plus10(int &r) {
        r += 10;
        return r;
    }
    int main() {
        int num1 = 10;
        int num2 = plus10(num1);
        cout << num1 << " " << num2 << endl;
        return 0;
    }
    
    /*运行结果:*/
    20 20
    

    注意:引用作为函数返回值时,不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁。

    引用的本质是什么?

    通过&r获取的不是r的地址,而是a的地址,r和a指代的是同一份内存。是不是r这个变量不占用独立的内存?

    变量r是占用内存的,而是编译器不让获取它的地址。r存储的是变量a的地址,这说明引用和指针非常相似。
    引用只是对指针进行了简单的封装,它的底层依然是通过指针实现的。

    引用和指针的区别

    1.引用必须在定义时初始化,并且以后也要从一而终,不能再指向其他数据;而指针在定义时不必赋值,也可以指向任意数据。

    2.可以有const指针,但是没有const引用。因为引用本来就不能改变指向,加上const多此一举。

    3.指针可以有多级,但是引用只能有一级。例如:int **p是合法的,而int &&r是不合法的。

    4.指针使用++表示指向下一份数据,引用使用++表示它所指代的数据本身加1。

    引用不能绑定到临时数据

    指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘不能寻址。

    放在内存中的内容都可以使用&来获取地址,进而用指针指向它们。
    但是像表达式的结果、函数的返回值等临时数据,它们可能放在内存中,也可能放在寄存器中。一旦被放在寄存器中,就没法用&获取地址了。

    常量表达式虽然在内存中,但是没法寻址。为什么?

    因为常量表达式在编译阶段就可以求值。编译器不会分配单独的内存来存储常量表达式,而是将常量表达式的值和代码一起放在代码区,会被硬编码到指令中,不能寻址。

    引用和指针都不能绑定到无法寻址的临时数据。

  • 相关阅读:
    mysql重置id
    mysql数据类型
    手把手教你新建一个Vue项目
    用markdown开始优雅的写作
    源码阅读心得
    断点调试-程序员的必修课
    代码还是短点好!
    GoJS v1.8.27 去水印方法
    VS code不用集成终端如何修改并推送分支?
    LeetCode日拱一卒
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12350589.html
Copyright © 2011-2022 走看看