对C语言数据处理和指针的理解

本文探讨了C语言中的数据处理和指针理解,通过printf()函数为例,详细解析了参数传递、内存存储及数据转换的过程。强调了编程思想和机制理解的重要性,并通过实例展示了如何操作内存数据实现特定输出,旨在帮助读者深入理解C语言的本质。
摘要由CSDN通过智能技术生成

学习C有一阵子了,走了不少弯路,把太多的精力集中在语法上,感觉语法就是基础,语法学了半年,到最后还是不会编程,而语法也随着时间的流逝忘得差不多啦,后来才知道,语法是最次要的,重要的是编程的思想和对机制的理解,实践方能出真知。最近感觉小有成就,所以自己也想拽一下。因为涉及到了操作系统底层的工作机制,以及汇编语言的知识,所以如果里面的错误惹怒了哪位前辈,还请批评指正,包涵一下我这个胆大包天,舞文弄墨,不知好歹的伪高手。

好的,言归正传。今天讨论的话题是C语言的数据处理和指针。

大家对卫生纸肯定不陌生,第一印象是什么,擦屁股,呵呵,反映还挺快,但不可否认的是现在人们用它擦嘴也非常流行!这就对啦,其实计算机的本质无非就是从内存中取出数据,说白了就是把那些让人“兴奋”的二进制数取出来,然后为你所用,你想干什么就干什么,你想让它是什么它就是什么,就看你对这些怎么操作啦,好像白面一样,弄圆了,蒸锅里,出来就是馒头,弄得又长又细,放水里,出来就是面条。

 

那我们就从熟悉的printf()函数说起吧,探讨一下它的工作机制。

一个非常简单的例子:

printf(“%c     %d      %c       %d”,L,79,86,69);

1,这个函数和C有什么关系?

2,这个函数有几个参数?

3,这些参数放在了哪里?

4,找到之后如何输出他们?

好,我们依次解决。

1, 很多人认为printf()C特有的特性,是C的一部分,错啦,其实printf()C没什么

关系,你可以这么认为,它就是为了方便你和程序通信而使用的一个工具,就是一个函数,这个函数是由程序员按照C标准编写的,是额外编写的,是额外提供给你的函数库的一部分,就像是C++的类库一样,这些函数为你开发程序提供了方便,当然如果你是高手的话,在你开发程序时完全可以不用这些函数库,什么细节都自己处理,自己编写。如果你感觉这个printf()使用起来非常不方便,用户体验极差,好啦,你可以编写适合自己的I/O函数,封装起来,为你所用。

2, 对于大多数初学者来说,会认为它有4个参数,为什么呢?因为我们的目的是要在屏幕

上输出4个数字。其实不然,当我们找到这些参数时,真正对这些数据如何处理关键还要看第一个参数——字符串参数,因为它决定了这些数据以什么形式输出,所以说它有5个参数。

3, 那么这些参数放在哪了?我们知道这些程序计算机是不认识的,需要一个编译连接的过

程,最终生成一个.exe的二进制文件,然后我们用windowcommand提供的debug –u 对该文件进行反汇编(具体细节操作不再说,可以研究一下王爽老师《汇编语言》综合研究,找到代码在什么地方),查看一下它的汇编代码,发现开始的几条指令是将参数列表中的所有参数从右至左依次入栈(系统提供的栈机制,PUSH AX),以保存数据,注意第5个参数并不是将字符串入栈,而是将指向字符串的指针入栈,占用四个字节,字符串放在了一个叫只读存储区的地方,暂时先不讨论这个是什么玩意儿,否则就跑题啦。

4, 知道数据所在的位置啦,如何对栈内的数据进行操作呢?在反汇编时,你肯定会注意到

这两行代码,      PUSH BP     MOV BP ,SP   大家知道SP是指向栈顶的,现在bp也指向了栈顶,我们就可以利用bp对栈中的数据进行操作啦,*(int *)(_BP + 2 +4); 这样就取到了‘L这个数(bp的值入栈占用2个字节,我们还要跳过指针占用的4个字节,所以是_BP + 2 + 4,这只是一个地址,前面的(int *)是将它转换成指向一个字空间的指针,最前边的*是取其里面的内容);我们要从屏幕上输出,所以我们找一个显存空间输出它即可,

*(char far *)(0x0b8000000 + 160 * 10 + 40 * 2) = *(int *)(_BP + 2 +4),这时候屏幕第10行第40列就会出现一个大写的‘L’。

      前面几条都是铺垫,下面我们就进入真正的主题,就拿刚才的‘L’说事!为什么打印的是L呢?因为我们都默认%c就是要输出一个字符,而我刚才的操作确实也是这么做的,让它直接在显示器上显示,既然我们是从内存中将它读取了出来,那么它在内存中式怎么存的呢?很容易知道,‘L’对应着十进制的76,二进制的01001100,它就是以二进制的01001100在内存中存放的。开头我们已经说过了,数据在内存中,就看你怎么用,把它当什么用。还是这个‘L’,还是这个01001100取出它之后,我们现在不想让它在屏幕上显示‘L<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值