C++指针和引用

2021-12-28  本文已影响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); //加上*就是指针转引用
上一篇 下一篇

猜你喜欢

热点阅读