【指针大放送】预备篇

说到指针,永远是C语言玩家迈不过去的坎,令人害怕,也令人神往

这篇文章将要讲的是指针一系列的知识,分为预备篇,初篇,进阶篇,一步一步带你了解指针的前尘往事。

1 CPU 内存与硬盘

说到指针,首先要了解,CPU、内存与硬盘之间的关系 

【指针大放送】预备篇_第1张图片

1、介绍

CPU的中文全称是中央处理器(英文全称是Central Processing Unit),也叫处理器,是计算机的运算核心和控制核心。人靠大脑思考,电脑靠CPU来运算、控制。让电脑的各个部件顺利工作,起到协调和控制作用。

内存:1. 负责硬盘等硬件上的数据与CPU之间数据交换处理;2. 缓存系统中的临时数据。3. 断电后数据丢失。

硬盘:存储资料和软件等数据的设备,有容量大,断电数据不丢失的特点。也被人们称之为“数据仓库”。

其实内存在这里起了两个作用:

1. 保存从硬盘读取的数据,提供给CPU使用

2. 保存CPU的一些临时执行结果,以便CPU下次使用或保存到硬盘

2、三者之间的关系

简单来说,硬盘用来存储我们的程序和数据,当我们运行程序的时候,CPU首先接受到我们的命令,之后CPU是告诉硬盘,我要运行你存储的程序A,你把程序A送到内存去。CPU对内存说,我让硬盘把程序A送到你这里来了,你保存一下。 等程序A被完整的送到内存之后。CPU就开始执行程序A。

过程就像上面说的,我们在举一个接近我们生活的例子。

如果说把硬盘比喻成一个大仓库,CPU比喻成加工车间,那么内存就是一个临时的小仓库。从距离上来说, 相比内存到CPU的距离和硬盘到内存的距离,内存和CPU的距离更短。

硬盘(大仓库)用来保存车间需要用的原料和最终生产出来的商品。仓库太大,取出原料和存储商品太慢,耗时间。

内存(临时小仓库):原料会先放到这里,小仓库,可以很快的找到需要的原料或商品。

CPU(车间):从内存(小仓库)里拿到原料,生产商品。中间会有半成品,半成品可以放在内存(小仓库)里。

了解三者之后,我们要开始思考,内存是如何架在两者之间传递数据的呢 

2 内存中访问数据

首先,让我们想象,有一个宾馆,A进入到了其中,我们需要找到他,但不知道他的地址,则我们找他只能从第一间慢慢寻找;

但若我们知道他在几层几号楼,就可以直捣黄龙,直接拿下,内存也是如此 

【指针大放送】预备篇_第2张图片

 我们给内存编号,也就是地址指针

内存空间为了有效的进行管理

1.把内存空间划分为一个个有效的内存单元,一个单元1字节

2.将每个单元进行编号  编号=地址=指针

2.1 为什么一个内存单元1字节

说到这,就会有一个疑问出现

为什么一个单元1字节?

首先要了解一些计算机的单位概念,

bit              1byte=8bit

byte           1KB=1024byte

KB             1MB=1024KB

MB             1GN=1024MB

GB              ..

TB               ....

PB               ....... 

我们熟知的char类型是1字节,为8比特位,设一个内存单元为1比特位,

则需要8个内存单元,也就是8个地址,更不用说int等等类型,这显然分配不合理

若一个内存单元1字节,一个int也只是需要4个地址,也就合理的多

 2.2 地址哪里来

到这里,我们明白内存中的数据是依靠地址来访问,那地址从哪里来?

早期的电脑是32位机器,也就意味着32根地址线(即物理意义的电线)

【指针大放送】预备篇_第3张图片

每一根线代表一个比特位 ,也就是有1或0的可能,一共32根地址线,则为2^32种可能

也就是2^32字节的大小,进行计算4294967296/1024/1024/1024=4GB,也就是32位机器最大内存。

3 vs中演示

【指针大放送】预备篇_第4张图片

 int为4字节,32位比特位,用16进制表示为8位

【指针大放送】预备篇_第5张图片

a中存储0x00 00 00 0a,a为16进制中的10,在内存中反着放是取决于编译器,可以参考这篇文章中的大小端部分

【指针大放送】预备篇_第6张图片

从上图中可以发现,地址取的是申请内存中的最小地址 

4 创建指针

int a=0;
int *pa=&a;//*代表pa是个指针变量,int代表pa指向的元素类型
*pa=20//*pa代表找到pa指向的元素,也就是a,可以对其进行更改

【指针大放送】预备篇_第7张图片

 5 指针的大小

int main()
{
    printf("%d\n", sizeof(char *));
    printf("%d\n", sizeof(short *));
    printf("%d\n", sizeof(int *));
    printf("%d\n", sizeof(double *));
    return 0;
}

运行结果

【指针大放送】预备篇_第8张图片

 为什么会都为4呢?

因为在32为机器下,地址有32位比特位,换算为字节为4字节,故大小都为4字节

欢迎小伙伴们补充与纠正 !

你可能感兴趣的:(c语言,c++,开发语言)