文章目录

  • 指针和引用的区别
    • 0、前言
    • 1、指针、指针变量和引用
    • 2、指针变量和引用变量的定义
    • 3、引用的用途
    • 4、引用和指针的区别
    • 5、引用的底层原理
    • 6、代码示例
      • 6.1、示例程序1
      • 6.2、示例程序2

指针和引用的区别

0、前言

最近学习严老师的数据结构,发现很多函数声明时都会使用到引用,首先呢,我们要说的是,“引用”是C++中的概念,因为我没接触过C++,所以只能简单地看来看两者的区别。


1、指针、指针变量和引用

首先,我们先来看看指针、指针变量和引用的概念。

指针:即内存地址。

指针变量:存放内存地址的变量,即指针变量的值为指针。

引用:某块内存的“别名”,给一个已经存在的变量起一个“别名”。

注意:

  1. 不同类型的指针变量所占用存储空间是相同的,32位机用4字节存储地址,因此,32位的指针变量所占空间为4字节;64位则为8字节。
  2. 引用不是新定义了一个变量,而是给变量取“别名”,因此,引用变量和引用的变量共用一块内存空间,编译器并不会为引用变量开辟新的内存空间。

2、指针变量和引用变量的定义

指针变量的定义:

int num = 18;
int* p = # //指针变量p的值就是num的内存地址

引用变量的定义:

//引用是C++中的概念!!!
int num = 18;
int &r = num;  //引用变量r就相当于num的“别名”

注意:引用类型必须和引用实体是同种类型的,即变量是int型,则引用变量也必须是int型。

这一点倒是和指针很相似,关于指针类型和变量类型不兼容的问题,可以看《C语言_地址与指针类型不兼容造成的影响》)。


3、引用的用途

引用的主要用途:修饰函数的形参和返回值。

在C++中,函数的参数和返回值的传递方式有三种,分别为值传递、指针传递和引用传递。其中,引用具有指针的效率,又具有变量使用的方便性和直观性。

实际上引用可以做的事,指针都可以做,那为何还需要“引用”呢?

引用体现了最小特权原则,即给予程序元素完成其功能的最小权限,指针能够毫无约束的操作内存中的任何东西,功能很强大,但也很危险。


4、引用和指针的区别

上面说了,引用可以做的事,指针都可以做,但是两者还是存在一定区别的。

  1. 初始化:引用在定义时必须初始化;指针则没有要求(尽量初始化,防止野指针)。
  2. 引用在初始化引用一个实体后,就不能再引用其它实体;而指针可以在任意时候指向一个同类型实体。
  3. 没有NULL引用,但是有NULL指针(空指针)。
  4. 占用空间不同:使用sizeof()函数,引用结果为引用类型的大小;指针始终是地址空间的大小,即32位机4字节,64位机8字节。
  5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
  6. 有多级指针,但没有多级引用。
  7. 访问实体的方式不同,指针需要显式解引用,引用编译器帮我们处理。
  8. 引用比指针使用起来相对安全(只是相对,不是绝对)。

5、引用的底层原理

引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换。

我没学过汇编语言,但是我咨询了我的舍友大佬,他们通过编译器调试观察反汇编语言发现,引用和指针的反汇编语言是一样的,就是编译器帮我们完成了转换。

底层实现:引用通过指针实现,定义一个引用类型的变量相当于定义于一个指针类型的变量。

注意,引用是”别名“,不是指针,并没有发生拷贝,我们可以认为“引用”是“简单版的指针”。


6、代码示例

6.1、示例程序1

#include "stdio.h"void modifyNumByPoint(int *p);void modifyNumByReference(int &r);int main() {int num01 = 18;int *p = &num01;printf("num01 = %d\n", num01);modifyNumByPoint(p);printf("modifyNumByPoint--num01 = %d\n", num01);printf("==========================\n");int num02 = 20;int &r = num02;printf("num02 = %d\n", num02);modifyNumByReference(r);printf("modifyNumByReference--num02 = %d\n", num02);}void modifyNumByPoint(int *p) {(*p)++;
}void modifyNumByReference(int &r) {r++;
}
结果:
num01 = 18
modifyNumByPoint--num01 = 19
==========================
num02 = 20
modifyNumByReference--num02 = 21

6.2、示例程序2

如果是在子函数内修改主函数的一级指针,一般在数据结构中用得比较多,如链表等等,则可如下定义:

//引用
void modifyByReference(int *&){p = ……;……
}//指针
void modifyByPoint(int **p){*p = ……;……
}

注:如有错误,敬请指正!!!

C语言_指针和引用的区别相关推荐

  1. 【C语言】指针和引用的区别

    [对象] C++primer中对 对象的定义:对象是指一块能存储数据并具有某种类型的内存空间. 一个对象a,它有值和地址&a,运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,我们通 ...

  2. c++工作笔记001---c++相关零碎要点_endl、“\n”和‘\n’区别_extern int a关键字_-的意思_::的意思_指针和引用的区别

    JAVA技术交流QQ群:170933152 "\n" 表示一个字符串,只有一个数据是回车符 '\n' 表示一个字符 这两个在输出上是一样的! 关于endl: 1. 在c++中,终端 ...

  3. C++_指针和引用的区别

    https://blog.csdn.net/zhengqijun_/article/details/54980769

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

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

  5. C++中指针和引用的区别与联系

    原文地址:http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址 ...

  6. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  7. 24.指针和引用的区别

    在面试时经常会被问到 指针和引用的区别,虽然问题很简单但还是总结一下! 指针和引用的区别其实有太多了,主要的区别大概是这样子: 1)指针声明的时候可以不被初始化(有可能成为野指针),但是引用必须要进行 ...

  8. 2020-12-6(从反汇编理解指针和引用的区别)

    这是我10个月前看到的一篇博客吧,感觉分析指针和引用的文章这是我目前见过讲解得最清晰的一篇: 本文主要基于反汇编代码,从初始化.赋值以及取地址三个角度来理解指针和引用的区别. 初始化 写出以下代码并查 ...

  9. C/C++ 中指针和引用的区别

    C/C++ 中指针和引用的区别 1.指针有自己的一块空间,而引用只是一个别名: 2.使用 sizeof 看一个指针的大小是 4,而引用则是被引用对象的大小: 3.指针可以被初始化为 NULL,而引用必 ...

最新文章

  1. Android 拨号器
  2. RT600之Mailbox
  3. python语言用什么来表明每行代码的层次关系_2021年尔雅通识课《切削原理与刀具》课后习题答案...
  4. Win32程序中使用Combo box控件
  5. android 设置网络超时时间设置,Android:AndroidHttpClient-如何设置超时时间?
  6. 了解 MongoDB 看这一篇就够了
  7. 【ShaderToy】跳动的心
  8. JZOJ.5325【NOIP2017模拟8.21】九九归一
  9. MongoDB(芒果数据库)学习(一)———增删改查
  10. 最适合晚上睡不着看的 7 个网站,建议收藏哦
  11. 5不触发系统键盘_防盗报警系统基础知识汇总
  12. 双向链表 建立和插入
  13. P2P网贷平台转型案例
  14. 春招秋招忆---远景智能笔试
  15. sherlock软件使用_如何在不使用电缆的情况下播放BBC的“ Sherlock”
  16. 入离职管理系统——类的抽取和注册登录功能
  17. html右键菜单背景图片,鼠标右键的普通背景怎么更换为漂亮的菜单背景?
  18. GBDT+XGBoost算法详解(下):XGBoost
  19. linux获取usb键盘、扫描枪输入数据
  20. EmguCv多边形包围

热门文章

  1. 基于物品 的协同过滤推荐算法(ItemCF)
  2. JavaScript组合函数
  3. android4.0.3 关掉开机声音
  4. Java基础19--System--Runtime--Math--Date--Calendar
  5. 关于SQL server 内容乱码问题的资料收集
  6. DotNetBar(二)
  7. JavaScript 30. JSON
  8. 单向链表与双向链表区别
  9. Sandcastle入门:创建C#帮助文档
  10. Windows10隐藏开始菜单栏,改变菜单栏位置