美文网首页
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++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • C++入门系列博客三 引用和指针

    C++ 引用和指针 作者:AceTan,转载请标明出处! 引用和指针对于C++来说很重要,是学习C++绕不过去的一...

  • 指针和引用的辨析

    先来看两个图 指针与引用的区别 1.指针在C和C++中均有,而引用是C++独有的特性(*指针申明符号,&引用申明符...

  • java中的引用与c++中的指针的区别

    java中的引用与c++中的指针的区别 Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对...

  • C++知识点

    C++基本方法: C++ memcpy C++基本特性: C++引用(vs指针) C++指针 C++封装: 将...

  • C++中的引用和指针

    C++ 引用与指针的比较 引用是 C++ 中的概念,初学者容易把引用和指针混淆一起。 以下程序中,n 是m的一个引...

  • 绿盟面试准备

    C++基础知识 指针和引用的区别: 指针是一个变量 ,引用是别名.指针可以初始化为空, 引用必须初始化为具体的值....

  • C/C++ basis 01

    1. C和C++区别 2. 指针和引用 sizeof(引用)等于 引用指向对象的大小。 对比值传递,引用传递(引用...

  • C++引用和指针

    ①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被...

  • C++指针和引用

    一、指针与强制类型转换 指针类型的强制转换,是指将指针所指的内容的类型由原先的类型转换为后面的类型 p和p1的值都...

网友评论

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

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