当前位置: 首页 > article >正文

C语言的指针和java的引用有什么区别?

C语言的指针和java的引用有什么区别?

    • C 语言的指针和 Java 的引用的区别
      • 1、定义:
      • 2、操作的范围与功能:
      • 3、内存管理:
      • 4、安全性
    • java引用里面存的到底是不是内存地址?

C 语言的指针和 Java 的引用的区别

首先,先从一下四个方面来说明一下区别:
定义,操作与功能性,安全,内存

1、定义:

  • C语言指针:指针是一个变量,用来存储另一个变量的内存地址。
  • java引用:引用是一个变量,用来间接访问堆内存中的对象。

无论是c语言指针,还是java引用,都是变量。只在定义上还是没有什么区别的。

2、操作的范围与功能:

两者的操作范围与功能主要体验在以下方面:

  • C指针的功能:指针可以直接指向任何合法的内存地址(包括变量)。并且允许操作地址值。即进行地址运算(如加减操作)和解引用操作。
  • java引用的功能:Java 的引用只能指向堆内存中的对象,不能指向基本类型的变量。引用不允许进行算术运算(如不能 str++),也无法直接获取或修改对象的内存地址。

3、内存管理:

  • C指针:在 C 语言中,指针指向的内存需要手动分配(malloc)和释放(free)。
    如果忘记释放内存,会导致内存泄漏。
  • java引用:Java 中的对象内存由 JVM 的垃圾回收器(GC)自动管理,开发者无需手动释放内存。
    只要一个对象没有引用指向它,GC 就会回收其占用的内存。

4、安全性

C 指针的安全性问题:由于可以直接操作内存地址,C 指针容易导致安全问题:

  • 野指针:指针未初始化就使用。
  • 悬垂指针:指针指向的内存已经被释放,但仍然使用。
  • 缓冲区溢出:指针操作越界,可能破坏其他内存数据。

Java 引用的安全性:Java 不允许直接操作内存地址,因此没有野指针和悬垂指针问题。

  • 但可能出现空指针异常(NullPointerException)

java引用里面存的到底是不是内存地址?

这个问题,经过我了解以后。答案是这样的:早期确实是这样,但是中后期发生了变化。具体如下:
在理论上,引用需要某种机制来“定位”堆内存中的对象,因此它必须保存一些信息,在最早期,某些 JVM(如 HotSpot 的早期实现)会直接在引用变量中存储堆内存中对象的地址。
这种实现方式简单高效,引用变量通过存储的地址直接访问堆中的对象。缺点是当对象地址发生变化,需要手动更新引用中存储的内存地址。

后面衍生出了句柄池模型:引用变量存储的是一个句柄的地址,而句柄本身是一种间接指针。句柄池是一个独立的内存区域,每个对象在句柄池中都有一个条目,条目中保存了:
对象的实际地址(指向堆内存中的对象数据)。
对象的元数据(如类型信息、GC 信息)。
引用访问对象时,首先通过句柄找到对象的地址,再访问对象数据。
句柄池的优点是
方便对象移动:在垃圾回收(GC)过程中,堆中的对象地址可能会发生变化,但句柄的地址是固定的,引用无需更新。
但还是存在间接寻址的开销。

最后一种方式:直接指针(Direct Pointer 模型),大多数现代 JVM(如 HotSpot 默认)采用这种实现方式。引用变量仍直接存储堆内存中对象的地址(和第一种模型类似),但存储的不一定是物理地址。存储的地址可能是一个逻辑地址,由 JVM 和 GC 管理,通过对象头(Object Header)获取元数据。
优点是
适合现代垃圾回收算法:支持堆压缩(Compacting),通过调整对象头或逻辑地址来避免手动更新所有引用。

原文地址:https://blog.csdn.net/qq_57828911/article/details/144605038
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/448391.html

相关文章:

  • 特制一个自己的UI库,只用CSS、图标、emoji图 第二版
  • HBuilderX打包ios保姆式教程
  • 【ArcGIS微课1000例】0137:色彩映射表转为RGB全彩模式
  • 智慧公厕大数据驱动下的公共卫生管理与优化
  • C++ union 联合(八股总结)
  • elementUI项目中,只弹一个【token过期提示】信息框的处理
  • 3 需求分析
  • Windows装Docker至D盘/其他盘(最新,最准确,直接装)
  • 【Linux】常用命令大全
  • ubuntu 安装更新 ollama新版本
  • 网络地址转换NAT
  • DeepFaceLab技术浅析(三):自编码器模块
  • 浏览器对JSON格式数据的支持【超详解】
  • #渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍04-盲SQL注入(Blind SQL Injection)
  • upload-labs靶场保姆级攻略
  • Python使用队列加多线程处理数据
  • SSM 医院预约挂号系统 Vue 实现:开启智能医疗新征程
  • 如何设置浏览器不缓存网页
  • Fastjson <= 1.2.47 反序列化漏洞复现
  • 剑指offer搜索二维矩阵
  • stm32中有哪些库?其中标准库和HAL库有什么区别?
  • 7_HTML5 SVG (3) --[HTML5 API 学习之旅]
  • 【深入理解@ExceptionHandler】
  • 深圳龙岗戴尔dell r730xd服务器故障维修
  • springboot vue 会员收银系统 含源码 开发流程
  • 网络安全怎么学习