我所认识的C语言

  此文是对自身知识的总结,适合没有什么编程经验人员和有经验的人阅读,不对之处欢迎指正。此文并非科普文,只是概述一下大体的思路。

  C语言是一个古老而又经典的语言,也是计算机基础中必不可少学习的一门语言。

  我们说的编程语言究竟是什么? 们写程序是给计算机CPU看的,但是CPU所认识的是一堆二进制指令集,而且各种架构,各种型号的CPU所认识的指令集肯定是不一样的,记住这些指令集几乎是不可能的办到的事。 那怎么办呢?假设在现实中的情况,只会说中文的和只会说英文的人怎么沟通呢,那么肯定需要一个同时会中文和英文的翻译员。编译器就是我们的翻译员。编译器就我们写的C代码翻译成目标机器上的指令,所以这些指令就能被目标机器所认识了。

  我们在学习任何一门语言时,基本上首先都会看到学习数据的基本类型。例如C语言,基本类型有 char,short,float,double,long,指针* 等.(也许还有,记不清了),还有数组,枚举,结构体等(不知道是否算是基本类型)。我们都知道,char基本是一个字节,short类型占两个字节,long类型可能占4个或者8个字节。可是谁规定它们占多大空间内,那当然是编译器了。一个简单示例说明编译过程是怎样的: {char a = 1;int b = 2; int c = 1 + 2;}     编译后的指令大概是 put a in address 0x100,put b in adress 0x101;fetch from adress 0x100 and fetch from adress 0x104 then add them and put the result to 0x108. 当然我写的只是一个思路过程,实际中的指令与内存分配与具体编译器有关。初学C语言时,一般是学一些算法做算法题,那个时候很纳闷天天玩这些算法把一堆数据搞来搞去能干嘛呢,想计算机那丰富多彩的世界是怎样来的呢。后来才明白,原来编程就是玩数据,就是在操纵内存里面那些数据。绚烂多彩的画面是因为我们传了那些描述图画的数据给显存,最终它们肯定是通过硬件通过电子电路来实现。但是站在软件层次来说,只要操作相关的寄存器,按照硬件设备的标准给出符合它要求的数据就行了。 软件与与硬件通信层的代码就是所谓的驱动了,而基本上所有的驱动都是用C来实现的。

   一些神奇的用法。其实神奇的用法都不神奇,不过也确实神奇,因为是建立在你对这门语言的语法特性,还有它的编译器有非常深入的理解之上。这样才能在使用这门语言时游刃有余,投机取巧。举一个例子:求一个结构体中某个元素在所在结构体中的偏移地址。struct  T{int a , int b,int c};,求元素b在结构体中的偏移。一般我们会这么想 T t. &t.b - &t.a   可是这样不利于扩展,因为根本不知道以后会如何在这个结构中增删元素,如果在a前面增加一个元素那么此方法就会失效了。所以有一个更好的办法是 &(((T *)0) ->b) ,乍一看通过0地址去访问元素不是会挂掉吗,但是事实上却事编译器在编译这个语句时会简化它会b在结构何中的偏移量,只是被翻译成了一个数字而已就是我们要的结果,压根不会翻译出类似0->b这样的指令。所以这就利用了编译器来为我们干活,让编译器让找b的偏移量实在就太妙了,因为它清楚我们当前结构体的一切,而我们却不清楚我们结构体的将来,并且有可能会反复修改。

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值