C语言作死——指针

在c语言的学习里面,对于初学者来说,最最难懂的感念应该就是指针了吧。想当初学习指针的时候,简直是一场噩梦啊,完全不了解指针是什么东西,即使会用也只是有样学样而已。直到后来学习了更加作死的汇编语言以后,回过头才完全理解了指针的概念。(这货只是在安利汇编

的确,对于初学者来说,c语言的指针确实是比较难以理解的概念。所以 (我们就来说说指针的概念)才怪=,=我们来给指针的学习做做铺垫吧。

我们来说说地址的概念。
想必开始学习c语言的人应该都多少了解一些计算机的基础概念吧。应该知道我们的程序在运行的时候是在内存中的。程序的所有内容,无论是代码,或者是要处理的数据,所有的东西都是存储在内存中的。如果看过我前一篇文章的话,应该知道这一切其实都是存放在内存中2进制的数据。那么如果我们希望找到其中的一个或者一些2进制数据的时候,我们的电脑是如何找到我们想要的数据的呢?

这就是地址的由来,就像我们如果要找到一个地方,需要知道这个地方的确切地址一样。计算机要找内存中找到数据也需要一个地址。那么地址究竟是长啥样的呢?

说出来其实很无聊的啦,计算机里面除了2进制数据还有啥。这里就有一个地址

0xF823AB21

恩其实和int型的数据完全没有差别(´∇`) 。真的一点也没有。

那么计算机是怎么靠这个32位的数据,找到地址的呢?且听老夫慢慢道来。我们的windows操作系统,会给每一个程序分配4G内存空间

不要吐槽内存不可能够什么的,给你程序4G你也用不掉,用不到的都被系统大神回收了。不过系统保证你的程序在需要的时候会有4G的空间供程序使用就是了。

然后系统每8位,就是一个字节作为一个最小的单位,然后给每个字节一个标号,这个就是地址。标号从0开始,然后是1,2,3每个字节一个标号,最后一个字节标为0xFFFFFFFF。可以算一算,正好标号了4个G的内存空间。所以一个地址一般用32位。

然后这个地址可以用来干神马呢?就是为了读取内存中的数据了。恩,只要是数据,我就能用地址找到。什么代码啊,局部变量中的数据啊,全局变量中的数据啊,不管神马,都是内存中的数据,都可以用内存找到。

再来看c语言的变量,为什么可以靠一个变量来储存一个值呢?应该其实数据是储存在内存中的。那么变量其实就是一个地址了。程序靠变量代表的地址就可以找到数据了。

高级语言对于地址概念的封装其实是非常深的。所有和地址有关的东西,都用其他更加易于理解的方式展现了出来。比如说变量其实就是一个地址。再比如说函数的概念,为什么函数能实现跳转,有能返回调用的地方呢?其实也是因为函数调用的过程中使用了两个地址。一个的是调用函数的地址,另一个是被调用函数的地址。通过这两个地址,程序就能够实现函数调用和返回了。但是其中有关地址的概念其实全部被省略了,所以不理解地址也正常。而偏偏c语言里面有指针这个需要深刻理解指针的概念,所以╮(╯_╰)╭。。。

关于地址就到这里了,其实还有一个寻址的概念更加作死。不过没有汇编基础的话挺难说的,这里就不提了了。如果想了解c语言或者说是程序的实现细节的话可以去学学汇编语言(又来安利

挺想写一点高大上的,深刻的东西的,不过水平有限,所以稀里糊涂写了一些奇怪的东西。还好没人看,不会误人子弟。

PS:有人可能会问,我的计算机内存已经是8G的了,用32位的地址完全无法表示过来。对,32位地址只能寻址4G的内存空间。但是用8G内存的人应该都是64位系统吧,64位系统寻址用64位地址的哦。因为更复杂所以我在正文中略去了