美文网首页
C++指针和引用

C++指针和引用

作者: 我阿郑 | 来源:发表于2021-12-28 20:16 被阅读0次

    一、指针与强制类型转换

    指针类型的强制转换,是指将指针所指的内容的类型由原先的类型转换为后面的类型

    int a = 1;
    int *p = &a;
    float *p1 = (float*)p;
    

    p和p1的值都是&a,但是p是将&a地址中的值按照int型变量进行解释,而p1则是将&a地址中的值按照float型变量进行解释

    二、引用

    #include <iostream>
        using namespace std;
        int main() {
            int a = 99;
            int &r = a;
            cout << a << ", " << r << endl;
            cout << &a << ", " << &r << endl;
            return 0;
        }
    

    打印出的前一行是两个99,第二行是两个地址的值。注意,引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。由于引用和原始变量都对应同一份内存,所以对其中一个赋值可以改变该变量及其所有引用的值。如果读者不希望通过引用来修改原始的数据,那么可以在定义时添加 const 限制,即为常引用。

    定义或声明函数时,我们可以将函数的形参指定为引用的形式,这样在调用函数时就会将实参和形参绑定在一起,让它们都指代同一份数据。如此一来,如果在函数体中修改了形参的数据,那么实参的数据也会被修改,从而拥有“在函数内部影响函数外部数据”的效果。

    #include <iostream>
    using namespace std;
    
    //直接传递参数内容
    void swap1(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
    
    //传递指针
    void swap2(int *p1, int *p2) {
        int temp = *p1;
        *p1 = *p2;
        *p2 = temp;
    }
    
    //按引用传参
    void swap3(int &r1, int &r2) {
        int temp = r1;
        r1 = r2;
        r2 = temp;
    }
    
    int main() {
        int num1, num2;
        cout << "Input two integers: ";
        cin >> num1 >> num2;
        swap1(num1, num2);
        cout << num1 << " " << num2 << endl;
    
        cout << "Input two integers: ";
        cin >> num1 >> num2;
        swap2(&num1, &num2);
        cout << num1 << " " << num2 << endl;
    
        cout << "Input two integers: ";
        cin >> num1 >> num2;
        swap3(num1, num2);
        cout << num1 << " " << num2 << endl;
    
        return 0;
    }
    
    1. swap1() 直接传递参数的内容,不能达到交换两个数的值的目的。对于 swap1() 来说,a、b 是形参,是作用范围仅限于函数内部的局部变量,它们有自己独立的内存,和 num1、num2 指代的数据不一样。调用函数时分别将 num1、num2 的值传递给 a、b,此后 num1、num2 和 a、b 再无任何关系,在 swap1() 内部修改 a、b 的值不会影响函数外部的 num1、num2,更不会改变 num1、num2 的值。
    2. swap2() 传递的是指针,能够达到交换两个数的值的目的。调用函数时,分别将 num1、num2 的指针传递给 p1、p2,此后 p1、p2 指向 a、b 所代表的数据,在函数内部可以通过指针间接地修改 a、b 的值。
    3. swap3() 是按引用传递,能够达到交换两个数的值的目的。调用函数时,分别将 r1、r2 绑定到 num1、num2 所指代的数据,此后 r1 和 num1、r2 和 num2 就都代表同一份数据了,通过 r1 修改数据后会影响 num1,通过 r2 修改数据后也会影响 num2。

    由于引用可以改变实参的值,它可以作为函数返回值,毕竟C++只能return一个变量,多变量的时候可以采用这个办法。但是在将引用作为函数返回值时应该注意一个小问题,就是不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁,有可能在下次使用时数据就不存在了,C++ 编译器检测到该行为时也会给出警告。

    三、引用和指针的区别

    #include <iostream>
    int main(int argc, char const *argv[])
    {
        int a = 5;
        int *p = &a;
        int &r = a;
        std::cout<<a<<std::endl;
        std::cout<<p<<std::endl;
        std::cout<<&r<<std::endl;
        return 0;
    }
    //输出:
    5
    0x7fffffffdca4
    0x7fffffffdca4
    

    四、指针和引用转换

    • 指针转引用:把指针用*就可以转换成对象,可以用在引用参数当中。

    • 引用转指针:把引用类型的对象用&取地址就获得指针了

    指针转引用

    // 1、函数声明为引用类型
    int Discover(std::vector<tDeviceInfo>& pDeviceInfo);
    
    // 2、参数声明为指针类型
    std::vector<DeviceData::DeviceInfo>* mDeviceInfo;
    
    // 3、调用函数,指针转引用
    Discover(*mDeviceInfo); //加上*就是指针转引用
    
    • 引用没有const,指针有const;(指针有“指针常量” 即 int * const a,但是引用没有int& const a,不过引用有“常引用”即const int &a = 1
    • 引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址

    相关文章

      网友评论

          本文标题:C++指针和引用

          本文链接:https://www.haomeiwen.com/subject/sszpqrtx.html