我不去想是否能够成功,既然选择了远方,便只顾风雨兼程。

---汪国真

程序道路需要不断学习,不断研究,大家加油!!!

大家好呀!今天要和大家分享的是指针(c/c++)和引用(c++),也即指针与引用的区别,本文章有理论讲解,也有代码演示,适合每个人,我坚信,看完这篇文章,你对指针和引用的理解一定会更加透彻,清晰。

以下代码格式均用C++语言写,如果你还没学到,别慌,代码会有注释解释!

一.刨析引用特性:

1.引用的定义:

引用是给一个变量取一个别名,以整形变量a为例,引用的形式为int &b=a(给a去一个别名叫做b),又比如(小明在家被家人叫做小明,在外被同学叫做小狗,这个小狗就是小明的别名,则int&小狗=小明),需要注意的是引用不是定义一个变量,而是给已存在的变量取一个别名,这个别名和变量名是共同存储在一块内存空间的。

举一个简单的例子,帮助大家理解;

直接上代码:

using namespace std;         //这是头文件,与c语音#include<stdio.h>相似;
int main()                    // 这是声明一个命名空间的意思;
{int a = 10;int& b = a;                 //变量a的别名为b;注意左边是别名,右边是实名;cout <<"a=" << a << endl;   //cout与c语言的printf相似,输出a的值;cout <<"b=" << b << endl;   //输出b的值;//endl是一个换行符,形如c语言里面的\n,注意这个l不是1,而是小写的L;return 0;
}

执行结果如下:

2.引用在定义的时候必须初始化:

直接上代码:

#include<iostream>          //这是头文件,与c语音#include<stdio.h>相似;
using namespace std;        // 这是声明一个命名空间的意思;
int main()
{int a = 10;int &b;               //引用未初始化,编译器会报错;int &b = a;          //初始化为a,这语句的意思就是给a起一个别名叫做b;return 0;
}

3.一个变量可以有多个引用:

直接上代码:

#include<iostream>
using namespace std;
int main()
{int a = 10;int &b = a;int &c = a;cout <<"a=" << a << endl;cout <<"b=" << b << endl;cout <<"c=" << c << endl;return 0;
}

执行结果如下:

4.常引用与普通引用:

注意:常引用不能通过引用来改变变量的值,就相当于const int *const a;

#include<iostream>
using namespace std;
int main()
{普通引用:int a=10;int& b = a;       //普通引用可以通过引用来修改变量a的值,相当于int *const a(指针常量)常引用://同类型的常引用const int a = 10;int& b = a;       //编译器会报错,因为a是常量,不能通过普通引用来引用a;//不同类型的常引用float a=10.24;int &b = a;       //编译器会报错,因为10.24是常量;return 0;
}

5.一个变量的引用只能引用一个实体:

直接上代码:

using namespace std;
int main()
{int a = 10;int& b = a;int& c = a;        //b和c均为a的别名,即引用,也就是说一个变量可以有多个引用int a1 = 10;int a2 = 10;int& b = a1;int& b = a2;     //引用的变量只能唯一,也就是在别名(b)一样的情况下,右边的变量(a1||a2)只能唯一return 0;
}

6.引用总结:

(1)引用是给一个变量取一个别名格式为int &a=b;

(2)引用在定义的时候必须初始化;

(3)一个变量可以有多个引用;

(4)常引用与普通引用;

(5)一个变量的引用只能引用一个实体;


二.引用和指针的区别:

1.两者的定义与性质不同:

指针是一个变量,存储的是一个地址,指向内存的一个存储单元;

引用是原变量的一个别名,跟原来的变量实质上是同一个东西;

#include<iostream>
using namespace std;
int main()
{int a=1024;int*p=&a;// p是指针, &在这里是求地址运算int&b=a;// r是引用, &在此起标识作用return 0;
}

上面定义了一个整型变量 a,p 是一个指针变量,p 的值是变量 a 的地址;

然而引用 b,b是 a 的一个别名,在内存中 b 和 a 占有同一个存储单元;

2.指针可以在定义的时候不初始化,引用必须在定义的时候初始化:

#include<iostream>
using namespace std;
int main()
{int*p;// 合法,指针可不初始化;int&r;// 不合法,引用不可不初始化;int a=996;int&r=a;     // 合法return 0;
}

3.指针可以有多级,引用只能是一级:

int**p;// 合法
int&&a;// 不合法

4.指针可以指向NULL,引用不可以为NULL:

#include<iostream>
using namespace std;
int main()
{int*p=NULL;  // 合法,指针可以指向NULLint&r=NULL;  // 不合法,引用不可以为NULLreturn 0;
}

5.指针初始化之后可以再改变,引用不可以:

#include<iostream>
using namespace std;
int main()
{int a=1024;int*p=&a;  // 初始化, p 是 a 的地址int&r=a;   // 初始化, r 是 a 的引用int b=885;p=&b;      // 合法, p 更改为 b 的地址r=b;      // 不合法, r 不可以再变return 0;
}

6.sizeof 的运算结果不同:

int a=1024;
int *p=&a;
int &r=a;
cout<<sizeof(p);// 返回 int* 类型的大小
cout<<sizeof(r);// 返回 int 类型的大小

注意:64位机器上,int* 类型的大小为8个字节,int类型的大小为4个字节。

32位机器上,int* 类型的大小为4个字节,int类型的大小为4个字节。

7.自增运算意义不同:

如下图所示,p++之后指向a后面的内存,然而b++相当于a++

#include<iostream>
using namespace std;
int main()
{int a=1024;int*p=&a;int &b=a;p++;b++;return 0;
}

8、指针和引用作为函数参数时,指针需要检查是否为空,引用不需要:

void fun(int*p)
{// 需要检查P是否为空if(p==NULL){cout<<"需要检查p是否为空"<<endl;}
}void fun(int&b)
{// 不需要检查bcout<<"不需要检查b"<endl;
}

注意:指针和引用都可以作为函数参数,改变实参的值。

9.总结:

(1)两者的定义与性质不同;

(2)指针可以在定义的时候不初始化,引用必须在定义的时候初始化;

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

(4)指针可以指向NULL,引用不可以为NULL;

(5)指针初始化之后可以再改变,引用不可以;

(6)sizeof 的运算结果不同;

(7)自增运算意义不同;

(8)指针和引用作为函数参数时,指针需要检查是否为空,引用不需要;

以上如有错误请求指出,谢谢你们,晚安!!!

2022.01.12

From:努力进大厂的新青年

指针和引用总结(详细,易懂,全面,直观)相关推荐

  1. 【C++引用超详细笔记, 引用、指针和值传递的汇编级辨析,对象、继承和引用】

    文章目录 引用变量 1. 什么是引用.如何创建一个引用变量? 2. 引用的具体使用方法 2.1 引用做函数的形参 2.2 引用参数的const用法 左值.右值是什么? 2.3 结构体的引用 2.4 引 ...

  2. C语言的指针*和引用

    首先是一道关于类型转换的面试题,要求给出float变量强制转换成int型和int &输出的结果. [cpp] int test()  {      float a = 1.0f;      c ...

  3. c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用

    作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...

  4. c语言实参形参函数调用指针引用 符号实例,C语言实参、形参、函数调用、指针、引用、符号实例.doc...

    C语言实参.形参.函数调用.指针.引用.符号实例 C语言实参.形参.函数调用.指针.引用.*&符号实例 实现环境:VC6 程序源代码: #include "stdio.h" ...

  5. 最详细易懂的CRC-16校验原理(附源程序)

    from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码( ...

  6. 【转】指针和引用的区别

    c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使 ...

  7. C++中的指针与引用

    写在前面 指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将最 ...

  8. C++中的指针与引用(转)

    原文地址: http://www.cnblogs.com/skynet/archive/2010/09/22/1832911.html 写在前面 指针和引用形式上很好区别,但是他们似乎有相同的功能,都 ...

  9. 再议指针和引用的一些事情吧

    关于指针和引用一直是学习C++的同学们争论的焦点,什么时候用指针,什么时候用引用,还有怎么引用数组,这么用指针访问数组,以及初始化的问题. 不过有一些文章我在很早就已经写过,但是由于当时时间不充分,自 ...

最新文章

  1. 插件框架实现思路及原理
  2. Google Chrome v48.0.2564.
  3. 主成分分析计算机如何实现,主成分分析(PCA)原理及R语言实现及分析实例
  4. 【C语言】创建一个函数,判断某一正整数是否为完数,并调用这个函数找出1000以内所有完数...
  5. power bi报表服务器_如何将Power BI Report Server报表嵌入ASP.Net Web应用程序
  6. 802.11无线信道详解
  7. Oracle用户权限分配的具体方法
  8. js替换问题replace和replaceAll
  9. 手机怎么更改ip地址
  10. 自动驾驶-毫米波雷达系列基础篇-测速原理
  11. 发那科机器人GI分配_发那科机器人IO信号的种类与常用信号的分配
  12. 原型模式,孙悟空都会用,猴毛变出的小猴子!
  13. 河南对口升学计算机考纲,2018年河南省对口升学考纲.
  14. 加菲猫语录精选74 中英俄三语版
  15. JavaScript 编程精解 中文第三版 九、正则表达式
  16. 小白思路理顺U-Net模型(keras)--预测部分
  17. python的数据与matlab互通:SciPy
  18. 【面试题】面试题Redis
  19. 计算机毕业设计Java中医保健网站(源码+系统+mysql数据库+Lw文档)
  20. 解决labelimg闪退

热门文章

  1. 设计模式-对象池技术
  2. 音乐爬取、requests库、Python爬虫
  3. 4diac 分布式应用-部署到不同的设备中运行
  4. 课堂笔记 - Redis - 01
  5. 【语义分割】ps实现对粗标签精细标注
  6. sisco路由器的升级
  7. 【Vue】数据改变,DOM不渲染问题
  8. T100查询报表开发流程
  9. 【无线图传】基于FPGA的简易无线图像传输系统verilog开发,matlab辅助验证
  10. 不建议安装macOS Ventura Beta的4个理由