资源描述:
《C语言声明、指针、数组、函数、typedef等等的一通“超级扯”.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、关于C语言声明、指针、数组、函数、typedef等等的一通“超级扯”ﻫ按:在CSDN论坛上,有坛友这样提议:typedef int(*PF)();ﻫ应该被写作:typedefint(*)() PF;ﻫ才是“严谨”、“合乎逻辑"的.对此,我来说说吧……typedef关键字的意思是“关于类型的定义"。为什么要有“类型”这个观念?我们都知道,在计算机的内部,一切数据和功能性代码(比如函数、命令、指令等)都是以0、1组成的有序排列来进行存储和运算等处理的。所以,我们总是会这麽说:“计算机只认得‘二进制’”。ﻫ在C
2、编程语境中,当我们写下:ﻫinta;的时候,实际上是在告诉编译器这位老Boss:请您为我的程序在存储器中预留一块地方,这块地方不论将来会存储什么样的东东,您一律把那些东东视作“整数”来处理。ﻫ老Boss根据自己所在的计算机架构或操作系统环境,确定1个“整数”需要在存储器里面占有多大的地盘。而我们经常使用的架构或环境,决定了,这块地盘的大小,通常是4Bytes即32bits。而“a”这个符号,是我们的程序用来称呼那块地盘的代号。也就是说,在我们的程序中,将来凡是用到了“a"这个符号,就是在告诉老Boss:我
3、是让您在那块地盘上做些什么,如读取那里的数据(当a作为右值),或向那里刷入什么数据(当a作为左值).当然,这所有的处理,均是把那块地盘上既有的数据或将要刷入的数据,作为“整数”来看待。ﻫ以上这一切,就叫做“定义性声明(definingdeclaration)”,我们可以根据不致引起歧义的某种习惯,简称它为“定义”或“声明”。(严格地说,变量的定义与声明,两个概念之间,有一些微妙的联系与区别,在此不再赘述。)ﻫC语言采用了不同于其他语言的规则,来让程序员进行这种声明工作。ﻫ作为比较,我们可以观察在Ada语言
4、中,类似的工作,是如何进行的:ﻫﻫa:integer;就这个简单的例子看来,我们除了看到Ada语言似乎利用了一种更加接近人类语言习惯的规则(语序以及冒号)之外,与C还是大同小异的,但是,后面所讲到的例子,就会把这种特性上的差异,扩大地展现出来。ﻫ此外,我们也不难意识到,C的这个规则,会跟基于对象(Object—Based)的某些思路,有一些“暗合"的地方,比如说:当我们利用class SomeClass{。。. ..。};来定义一个类之后,我们可以利用ﻫSomeClassAnObject;ﻫﻫ来将Some
5、Class这个类实例化出来一个具体的对象,即AnObject.我们已经了解到,SomeClass其实是对AnObject与其他具有相同“结构”的实例们的一种抽象.那么,我们可以反过来推:ﻫinta;ﻫ就可以用“变量a其实是int这个‘类'的一个实例化"这样的思路,来揣度(仅仅是一种类比性思维)C语言中声明变量的这件事情。ﻫﻫ以上这些,都是比较容易理解的.但是C语言不会就这麽轻易地放过我们。在C语言编程语境中,把一个“符号”的“类型"或“性质"表达出来,有远比“类型名变量名"更为复杂的方式。比如:ﻫﻫcha
6、ra[n];ﻫﻫ在这个例子中,引入了方括号。围绕符号“a”的事情就复杂了一层。方括号紧跟在符号“a"的右边,说明符号“a”是用来称呼一段连续分布在存储器中的多个数据,俗称“数组”.而这一段数据中的单位数据,即每个元素的“类型”是char,且所有元素均被视为char类型,概莫能外!ﻫﻫ“类型名变量名”的简单做法,已经失效了.在C中,我们不能用char array a;ﻫ或ﻫarray_of_chara;这样的写法来声明一个元素均为char类型的数组.ﻫ但是,在Ada语言的规则里,就可以这麽写:ﻫﻫa : a
7、rray(1..n)of Integer;在C语言的“侄子”——Perl语言中,用“@”来声明一个数组:ﻫﻫ@a=(value_alpha..value_omega);ﻫ而在C语言中,即没有array关键字,也没有用来声明数组的@符号,甚至C语言本身都不会对数组元素的下标是否越界做出令程序员知晓正误的判断 —- 这一切,不得不让我狗胆包天地,下了这个狂妄的断言:“在C语言中,压根儿就没有‘数组'这个东东!”(哎哟—-一只鞋子袭来!)ﻫﻫ不那么狂了,把话说回来:在C语言中,通过引入方括号,来声明一个数组。注
8、意,这个方括号对,与用“数组名[下标]”的写法来指明具体某个元素这种方法里的方括号对,是完全不同的。ﻫ在指明(术语叫“引用”)数组中某个元素的时候,也是用方括号对.这里的方括号对,叫做“取下标操作符"。其实“取下标操作符”是一种被包装起来的指针运算符,即一种存储器上的偏移量运算,所以,我们可以大胆猜测:在C语言中,这种利用方括号对来引用数组中某个元素的做法,应该是承袭于某些更加低级的(更加接近计算机存储机制底层的)语言.ﻫ这是