指针是什么?它指向哪里?也许我们最常听到的解释是指针就是地址。
地址怎么说?
如果你对计算机的组成部分了解得不够透彻,恐怕很难真正理解这个玩意儿吧?
接下来我们就深入计算机底层来了解一下指针到底是什么?
我们首先讨论这样一个问题,如果我们定义一个变量a。
那么变量a存储在哪里呢?
当您想到存储设备时,您可能会想到固态硬盘或记忆棒。
变量对读写速度有极高的要求。目前主流固态硬盘的速度为3-4GB/S(GB每秒),而主流内存条的速度可达40GB/S,两者速度相差近10倍。那么我们定义的变量a是存储在记忆棒中的吗?
其实不是,因为40GB/S还是不够快。有没有比记忆棒更快的内存?
是的,但我们很少有人关注它。这个存储设备位于CPU内部,也就是我们所说的缓存。缓存分为L1、L2、L3缓存。事实上,这是真正的内存,因为它位于CPU内部。由于内存模块位于CPU外部,因此实际上应该称为外部存储器更合适。
那么这些缓存的速度有多快?
你可以看一下,这是我电脑的缓存速度。 L1的读写速度可以达到4000GB/s以上,是记忆棒速度的100倍以上,是固态硬盘速度的1000倍以上。虽然我们感觉固态硬盘的速度已经达到了很快,但是比缓存慢很多。
我们定义的变量存储在缓存中。
那么缓存到底是什么?
其实缓存和内存都属于RAM,只不过缓存属于SRAM,而记忆棒是DRAM。
缓存之所以比记忆棒快,是因为缓存本质上是由触发器组成的。仅存储一位数据需要许多门电路,而一个门电路需要多个晶体管。
记忆棒只需要一个晶体管来存储一位数据,因此记忆棒可以远大于缓存容量。
你可以看一下。我的电脑总缓存只有20MB,内存条也有几G起步。
记忆棒依靠电容器的充电和放电来存储数据。充电和放电需要一段时间,但缓存一打开电源就可以存储数据。因此,就存储速度而言,SRAM比DRAM快得多。
接下来我们来说一下它是如何存储一位数据的。
该单元只有在地址线为1时才有效。此时,如果我们给数据输入1,那么它的数据输出就是1;如果我们给它0,则数据输出为0;
当地址线为0时,输入无效。
为了方便起见,我们使用一个小方块来表示一位SRAM 存储单元。
一个字节是8个小方块。他们共享一条地址线。写入前必须先向地址线写入1,然后向8个数据输入写入不同的数据。
这样就可以完成一个字节的读写。
那么读写两个字节呢?
我还需要添加9 根电线吗?当然这是可能的,但是电子工程师不会把东西设计得这么简单粗暴。
你可以看看这个电路。我们只需要添加一个非门,不需要添加任何额外的行。我们可以控制两个字节的数据。
首先,它们的数据输入都连接在一起。
当我们向它输入1时,经过非门后就会变成0。此时,上面的字节就允许读写了;
当输入0时,允许读写以下字节。
通过这个非门我们可以选择读取和写入哪个字节。
如果是两个字节,则只需要一个非门。
如果是8个自己的字节怎么办?
这时候就需要添加一个叫做解码器的东西。
这是一个38 解码器,它有3 个输入和8 个输出。
如果我们给它输入000,它第一个输出就是1,其他都是0;如果是001,则第二个输出为1;这是它的真值表。
它相当于一个选择器,这样我们就可以用3根地址线来控制8个字节的读写。
如果是4输入解码器,则可以控制16个字节。
10输入解码器可以控制1024字节,也就是我们常说的1KB数据。
16输入译码器可以控制65536字节,总共64KB数据,即它的寻址范围是64KB。
知道了这一点,我们再来看看C语言中的指针,就会有更深入的理解。
以该语句为例,它将a的地址赋给指针p。
a 是地址操作。如果我们的存储空间只有16个字节,如果当地址输入为1111时,解码器控制的是存储变量a的单元,那么a的地址就是1111,而该地址实际上就是解码器输入的二进制值,即,a的值为1111,转换为16进制为0xF。
将这个地址赋给指针p后,指针p的值为0xf。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/5344.html
用户评论
终于有人用别的方式讲C语言指针了!我之前看了很多传统的视频都一头雾水。
有10位网友表示赞同!
指针总是给我感觉特别高级,这种讲解方式让我更容易理解!
有11位网友表示赞同!
这篇文章真的太赞了!指针的知识点讲解的很清楚.
有16位网友表示赞同!
终于有人不用绕圈子讲指针了!清晰直观!
有19位网友表示赞同!
C语言指针真的很让人头疼,这个新颖的讲解方式真不错!
有7位网友表示赞同!
学习编程真是不容易啊,幸亏遇到了这篇讲解。
有9位网友表示赞同!
看来这种另类的方式真的管用,我理解了!
有14位网友表示赞同!
期待更多这样有趣实用的C语言教程
有16位网友表示赞同!
这个观点很好!指针的本质果然是空间地址管理!
有11位网友表示赞同!
感觉比书上讲的更直观!
有14位网友表示赞同!
学习C语言,这篇文章帮助我提升了理解指针能力!
有8位网友表示赞同!
讲解方式新颖有趣,点赞!
有17位网友表示赞同!
终于不再害怕指针这个怪兽了!
有16位网友表示赞同!
我的代码总是有问题,看来需要好好学习指针!
有18位网友表示赞同!
真棒!把C讲透让我更了解程序的运行机制!
有10位网友表示赞同!
希望有更多类似的文章
有8位网友表示赞同!
太赞了!这种讲解方式真的能让人理解。
有17位网友表示赞同!
指针这个概念,用图示讲解很有效!
有20位网友表示赞同!