C语言程序设计(电子版)

举报
资源描述
第1章 计算机、程序设计和C 语言概述为了全面认识和理解C 程序设计思想,了解一下计算机的工作原理,数据在内存中的存储形式,以及程序设计的发展趋势是很有必要的。学习本章内容后,读者会对计算机、程序设计和c 语言有个整体上的概念。1.1计算机概述回顾一下计算机技术蓬勃发展的简史,有助于我们从第一计算机语言的角度掌握本课程的内容,提高计算机文化的素质。20世纪40年代,许多新的科技领域,如核反应堆的控制,导弹飞行轨迹的控制等,都要求在较短的时间内完成较复杂的计算工作,靠人工计算是不可能的,必须想办法依靠某种形式的计算机。美籍数学家冯诺依曼(Von.Neuman)教授指出,如果用二进制而不用十进制进行数值运算,就可以利用电来进行运算,利用电路的开和关两种状态来表示二进制中的0 和 1,用重叠组合的开关电路就可制成一种计算工具,于是在 1946 年诞生了世界上第一金电子计算机 ENIAC(Electronic Numerical Integrator AndComputer)它用二进制代替十进制完成了复杂的数值运算。但是运算指令和数据还是通过重新连接电路和设定开关来完成的。通过实践,冯诺依曼又提出存储程序(Stored Program)的概念,即将运算指令和数据用数字的方式存放在电子计算机的存储器中,也就是首先提出了用软件来控制计算机的操作。这就形成了著名的冯诺依曼原理“二进制和程序存储控制”的计算机结构思想,为以后计算机的发展奠定了理论基础。自 ENIAC以来,计算机的研制、生产和应用以迅猛的速度发展着,到 2 0 世纪末计算机已经历了电子管(第一代),晶体管(第二代),集成电路(第三代)和大规模集成电路(第四代)四个阶段。目前应用的计算机,它里面所用的集成电路芯片的集成度越来越高,有的被称为超大规模集成电路。这四个时期的计算机都基于冯诺依曼原理,所以这四代计算机也称为冯诺依曼计算机。现在,计算机已是一种现代化的处理信息的工具。数字信息、文字信息、图像信息、动画信息和声音信息都可以通过计算机来进行存储处理。20世纪90年代以来,许多国家已致力于集文(字)、图(形)、声(音)于一体的多媒体计算机(MPC-Multimedia PersonalComputer)的研究,一台多媒体计算机可以具有电视机、录像机、计算机、电话机和录音机等的功能,计算机的应用开始进入每个家庭。加上计算机网络的发展,从小型的局域网到全球的Internet网,从传递信息的角度上讲,地球已变得越来越“小”了。与此同时,科学家们还在研制第五代计算机(非冯诺依曼计算机),它采用完全新的工作原理和体系结构,它的工作接近于人们思考问题的方法,是一种能与人交谈,自我学习,自我推理并有决策能力的智慧型计算机。这是计算机发展的方向,但近期还难以实现。本课程中,计算机指的是目前流行的大规模集成电路计算机。计算机系统由硬件系统和软件系统两部分组成。计算机硬件系统指的是计算机的具体设备,即实物。它由主机和外部设备两部分组成。而计算机主机又山中央处理单元CPU(Central Processing Unit)和内存储器(简 称“内存”)组成。CPU包含运算器和控制器两部分,外部设备则由输入、输出设备和外存储器组成。计算机的软件系统指的是程序。为了使计算机正常工作,程序是必不可少的。计算机做任何工作,都是通过存储在内存中的程序来实现的,可以说程序是计算机工作的“灵魂”。根据程序的不同用途,软件系统又可分为系统软件和应用软件两部分。系统软件,般是指生产厂家或公司在出售计算机时提供给用户的,它用来管理计算机的各项工作和为开发运行用户程序配备必要的软件包。如操作系统OS(Operating System),编译程序(Compiler),解释 程 序(Interpreter)以及一些集成(多功能)开发环境(软件)等。应用软件包括用户向厂家或公司定制的专用软件包和用户自己建立的各类源程序(高级语言编写的程序)或执行程序等。操作系统用来管理计算机内的所有资源(包括软、硬件资源)。如何充分引用计算机的全部资源和最大限度的发挥计算机各部分的作用是设计操作系统软件的指导思想。在操作系统的支持下,用户才能编辑源程序,并利用编译程序或解释程序翻译源程序成为机器能执行的二进制指令代码。集成开发环境是一个集编辑、编译、运行于一体的系统软件,它为用户编制应用软件提供很大的方便。1.2数据在计算机中的存储形式1.2.1 位、字节、字的概念在主机内的存储器,称内存储器,简称内存。要运行的程序和数据都存放在内存中。那么内存是由什么组成的呢?它原来是由千千万万个具有二个状态的电子开关组成的。电子开关打开的状态为“1”,闭合时的状态为“0”。每个电子开关用计算机术语“位(bit)”来称呼,它可以代表二进制数(逢二进一)的一个基本单元。计算机内存就是一个庞大的二进制基本单元电子开关的集合体。要存放信息,必须把这些电子开关有机的组织起来,一般用若干个二进制“位”组成一个,字 节 (byte),多数计算机用8 位组成一个字节,如 图 1.1 所示。最高位(一个二进制位(bit)最低位8 位组成一个字节(byte)图 1.1字节示意图一个字节可以存放一个字符,当然这个字符是用一个二进制数来表示的,这个二进制数就是这个字符的二进制代码。计算机上所应用的全部字符(字母、数字或其他专用字符)都有相应的二进制代码,如字母“a,它的二进制代码是:01100001来表示。这些字符和二进制代码之间的对应关系,很多计算机系统采用ASC II(AmericanStandard Code for Information Interchange即 美国标准信息交换码”)代码。这个代码与字符之间的对应关系见附录I。计算机内存就是由很多排列整齐的字节组成,为了管理方便,每个字节都有相应的位置编号,这个编号就是这个字节的“地址”,通过地址可以找到内存中任何一个字节的内容。一个字节可以存放一个字符,但要存放一个整数或一个实数,一个字节就不够了,有的系统上整数用2 个字节或4 个字节来存放,而实数用4 个字节来存放。由一个或若干个字节组成一个“字”,一个字可以用来存放一个数据或一条指令。1.2.2 内存单元、内存单元地址和指针的概念一个内存单元可以用来存放一个数据或一条指令,由于内存中每个字节都有自己的地址,因此每个内存单元也有自己相应的地址,由一个字节组成的内存单元的地址,就是这个字节的地址,而由多个字节组成的内存单元的地址,这个地址指的是组成这个内存单元几个字节中的第一个字节的地址。假定程序中已定义了三个短整型变量i、j、z,编译时系统分配给它们各一个内存单元,每个内存单元占两个字节,如 图 1.2 所示,图中每个长方形框代表两个字节。如果分配给变量i 的内存单元地址是5000(这只是假定的地址),那么变量i占用地址为5000开始的两个字节(即地址为5000和5001两个字节),5000是变量i的内存单元地址,简称变量i的地址,C语言中用符号“&i”来表示,这里&表示取地址运算符,&i的值是5000。若定义变量时j是紧跟在变量i之后,变 量z又紧跟在j之后,那么系统分配给这些变量的内存单元一般是连续的,即分配给变量j的内存单元地址是5002,分配给z的内存单元地址是5004,所以变量j的地址&j的值是5002(变量j占用地址为5002和5003两个字节),而变量z的地址&z的值为5004(变 量z占用地址为5004和5005两个字节),所以,当程序定义了某一变量以后,变量名和它占用的内存单元地址有直接的对应关系。请注意,要区别一个内存单元的地址和这个内存单元的内容(即变量值)这两个概念。对变量值的存取是通过地址来进行的,根据变量名和地址的对应关系,找到变量的地址,然后从这个地址所标识的存储单元中进行存取数据的操作。图1.2中,设变量i,j的值分别是5和3,要 执 行 个 操 作z=i+j时,过程是这样的:从变量i这个存储单元的地址5000开始的两个字节中取出变量i的值5,再从变量j这个存储单元的地址5002开始的两个字节中取出变量j的值3,通 过CPU将它们相加后得和8送到变量z这个内存单元中,即送到地址 为5004开始的两个字节中。这种按变量地址存取变量的方式称为“直接访问”方式,这里 的“访问”指的是在内存单元中存取(或称读写)数据的意思。图1.2内存单元分配示意图总之,通过变量的地址能找到变量的内存单元,因此,把变量的地址称作变量的“指针”,如地址5000是变量i的指针,地 址5002是变量j的指针。通过变量的指针可以找到变量的内存单元来对变量进行读写操作。指针指的是某个内存单元的首地址(或说一个内存单元的入口地址),因 此C语言中应用的指针是有数据类型的(详见第二章),而每一种数据类型的变量在内存中存放的数据是以内存单元为单位的。与“直接访问”相对应的另一种访问内存的方式是“间接访问”方式。C语言中可以定义一种变量专门用来存放地址,假定我们定义一个变量i_pointer是用来存放整型变量地址的,系统编译时分配给这个变量的地址假定是6 0 2 0,那么可以通过下面赋值语句将变量i的地址赋给变量Lpointer:i_pointer=&i;变 量i的地址值是5000,所以通过以上赋值语句就把地址值5000放入地址是6020开始的两个字节中,Lpointer的值就是5000。这样,我们就可以对变量i进行间接访问了,过程是:先从变量i_pointer中提取变量i的指针5 0 0 0,然后到地址是5000和5001两个字节中存 取i的值。这个过程,C语言中用一个存取内容运算符*,即*i_pointer,它可间接存取i的值。如*i_pointer=5;/*间接访问*/等效于i=5;/*直接访问*/因为这两个语句的结果都是给变量i 赋以5,但它们执行的过程不同,一个是通过间接访问,而另外一个是直接访问。图 1 .3 表示直接访问和间接访问的示意图。存(写)-5 i取(读)-5 0 0 06 0 2 0i _ p o i n t e r(a)直接访问(b)间接访问图 1.3 直接访问和间接访问图 1.3(a)表示对变量i 的值直接进行读写操作(直接访问);图 L 3(b)表示对i_pointer所“指向”的内存单元进行读写操作(间接访问)。因 为 i_pointer的值是变量i 的地址,所以称 i_pointer指向变量i,借助于i_poinler可以对变量i 进行读写操作。当 i_pointer的值用变量j 的地址&j重新赋值,那么借助于i_pointer可以对变量j 进行读写操作。因为i_pointer的值可以改变,所以称它为“指针变量。关于指针变量的定义详见第二章,这里只作概述,目的是说明借助于它访问内存的方式(间接访问的方式)。1.2.3 卜、八、卜六进制和二进制的相互转换计算机内部数的存储和传送是用二进制数,而我们习惯上使用的是十进制数。为了表达方便,在一些低级语言中常用八进制或十六进制的数,懂得这些数之间的相互转换是必要的。大家熟悉的十进制数有两个特点:(1)用 0,1,9 十个数字来表示;(2)逢十进一 。同样原理,二进制数的特点是:(1)用 0,1 二个数字来表示;(2)逢二进一。它是最简单的进位制,也是机器目前所能直接接受的。用二进制组成的代码称机器码。八进制数的特点是:(1)用 0,1,7 八个数字来表示;(2)逢八进一。十六进制数的特点是:(1)用 0,1,9 和 A,B,C,D,E,F 十六个数字或字母来表示015;(2)逢十六进一。由上分析,我们可以把二、十、八、十六进制数之间的对应关系列于表L 1 所示。表1.1 二、十、八、十六进制数之间的对应关系十进制数01234567891 01 11 21 31 41 5十六进制数0123456789ABCDEF二进制数011 01 11 0 01 0 11 1 01 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号