3分钟理解指针和引用的区别❤️建议收藏❤️

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3分钟理解指针和引用的区别❤️建议收藏❤️相关的知识,希望对你有一定的参考价值。


🎈 作者: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)指针变量有地址,而引用的地址是引用变量的地址;


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


以上是关于3分钟理解指针和引用的区别❤️建议收藏❤️的主要内容,如果未能解决你的问题,请参考以下文章

❤️虚拟化技术❤️之docker技术详解[⭐建议收藏⭐]

为了让师妹20分钟学会canvas,我熬夜苦肝本文外加一个小项目❤️建议收藏❤️

C语言☀️自定义类型(结构体+位段+枚举+联合体)建议收藏

Golang✔️实战✔️ 聊天室 ☢️建议手收藏☢️

Golang✔️实战✔️ 聊天室 ☢️建议手收藏☢️

❤️十分钟快速学会使用Nodejs全栈开发微信公众号建议收藏