c - 修改同一内存地址上的值如何删除以前的值?“关于 PC 模式操作的 OVERWRITTEN 概念”
问题描述
我是计算和计算机领域的新手..我正在使用 C 编程进行开发,实际上每次我陷入思考如果我们用新值修改 PC 会删除旧值时,我的意思是:假设我像这样写在C上
int i=6;
i=7;
那么 i 的值为 7,我知道为什么,因为我们已经将旧值修改了 7,但是 PC 是如何真正删除以前的值的呢?我可以相信“以前的值被覆盖,它将被删除”,但我很想知道它是如何通过分配修改后的值被删除的?
是不是很像魔术?对我来说仍然很奇怪..如果我们在同一内存地址上进行修改..
解决方案
计算机的存储量是有限的。他们覆盖该存储。它不像SSA 模型,每个赋值都会创建一个新变量。计算机确实改变了现有存储位置的价值。
C 语言是根据每个变量都有自己的内存位置来定义的。分配新值不会更改地址。它不是对新的不可变值的引用,它实际上是在改变int i
. 写入新值会隐式破坏变量的先前内容。它哪儿也不去。
您可以查看一个使用指针的示例,以查看在int *p = &i;
您从*p
更改中获得的值之后,i=7;
或者在谷歌上搜索有关 C 指针的教程以获取更多详细信息。
这不是“魔法”,只是存储单元如何自然工作。例如,单个触发器可以通过应用一个输入信号以及一个告诉它忘记其旧值的复位信号来从一种状态更改为另一种状态。
物理类比是一张带有铅笔和橡皮擦的纸, 而不是一大摞新鲜的索引卡片。“消耗品”(铅笔芯和橡皮擦)只是电力。(或者更具体地说,CMOS 逻辑中的电荷。其他一些类型的数字逻辑需要电流连续流动,消耗大量功率。)
CPU 寄存器通常由 SRAM(静态 RAM)制成,请参阅https://en.wikipedia.org/wiki/Static_random-access_memory#Writing。一个单元通常由 6 个晶体管组成,例如,像触发器一样,但更漂亮,并且没有电流流动,除非设置了新值。这存储 1 位,并且可以通过应用写使能信号将 SRAM 单元更新为其输入线中的值来多次写入新值。
实际的主存储器通常由DRAM制成,其中位作为电荷存储在电容器上。每次读完都要刷新这个charge,但还是一样的概念,固定位置可以写新值。
推荐阅读
- macos - 使用 RazorViewToStringRenderer 和 ServiceStack 渲染 razor 页面
- javascript - 我的 JavaScript 代码在 jquery ajax 调用后不会运行
- puppeteer - 如何使用 Puppeteer 从字符串中提取数字?
- angular - 无法在表格中显示数据(角度 9)
- java - getClass() 方法返回的类对象是该类的实例吗?
- c++ - 在递归函数 C++ 中创建向量
- java - 什么意思:“在 UI 线程上接收事件并在主循环线程上读取”?
- c++ - 在 C++ 程序 csv 文件中添加了额外的行?
- python - 如何查看谁创建了记录?
- node.js - 如何修复内部服务器错误?- Google Cloud