当前位置 博文首页 > Linux猿:3分钟理解指针和引用的区别【??建议收藏??】

    Linux猿:3分钟理解指针和引用的区别【??建议收藏??】

    作者:[db:作者] 时间:2021-08-21 22:14


    🎈 作者:Linux猿

    🎈 简介:CSDN博客专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

    🎈 关注专栏:C/C++面试通关集锦?(优质好文持续更新中……)🚀


    在 C/C++ 使用过程中,经常会使用指针和引用,那它们两个是什么区别呢?本文就来详细讲解一下!

    指针:是保存另一个变量内存地址的变量,指针通过 * 访问保存的内存地址所指向的值;

    引用:是另一个变量的别名,一旦被初始化就不能被改变,引用可以认为是一个具有自动间接性的常量指针,相当于编译器帮助实现了自动间接性取值,即:编译器帮助加上了 * 。引用内部实现为指针。

    指针是在 C 语言中就已存在,功能非常强大,但是许多的不安全因素也都是指针导致的。引用是 C++ 中引入的概念,引用使用起来更加安全。

    但是,C++引入引用的直接原因是支持 C++ 重载,来看下面一个例子:

    //没有引用的情况下
    void func1(const complex* x, const complex* y) 
        complex z = *x+*y;
        // ...
    }
    
    //有引用的情况下
    void func2(const complex& x, const complex& y)
        complex z = x+y;
        // ...
    }

    可以看到,在引入引用后,两数相加更加合理,是无感知的,而没有引用的情况下,能明显看到和普通加法运算不同。

    但指针和引用都有一个相同点:实现让一个变量对另一个变量的访问。

    来通过一个简单例子加深下理解:

    #include <iostream>
    using namespace std;
    
    int main() {
        int x = 10;
        int *p = &x;
        int &y = x;
    
        cout<<"*p = "<<*p<<endl;
        cout<<" y = "<<y<<endl;
    }

    输出为:

    linuxy@linuxy:~/pointerRef$ g++ main.cpp -o main
    linuxy@linuxy:~/pointerRef$ ./main
    *p = 10
     y = 10
    linuxy@linuxy:~/pointerRef$

    上面的例子可以通过下图来理解:?

    变量 p 存储 x 的地址,x 和 y 都是 10 的名称。

    接下来详细的讲解一下区别。

    (1)初始化不同

    指针可以先定义,再初始化,可以重复赋值。引用必须定义时初始化,一旦被初始化,就不能改变,类似于 const 定义常量。来看一个例子:

    int main() {
        int a = 10;
        //定义和赋值分开
        int *p; 
        p = &a;
    
        //定义时赋值
        int *q = &a;
    
        int &r = a;
        /*
            错误情况
            int &r;
            &r = a; 
        */
        //定义时必须初始化
        const int c = 10;
    }

    (2)赋值NULL

    ????????指针可以使用 NULL 赋值为空,引用不可以;

    (3)指针可以多级,引用只能一级;

    来看一个例子:

    int main() {
        int a = 10;
        int *q = &a;
        int **p = &q;
        cout<<"**p = "<<**p<<endl;
    }

    上面可以用下图来理解:

    p 需要两次才能取到 a 的值,当然,还有多级指针,这里就不深入了。

    (4)指针需要 (*)来引用值,而引用可以直接取值。

    (5)指针支持算术运算,而引用不能。

    (6)指针变量有地址,而引用的地址是引用变量的地址;


    🎈 欢迎小伙伴们点赞👍、收藏?、留言💬?


    cs