如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
指针和数组名的区别指针是C语言具有低级语言特征的最直接的证据。在汇编语言里面指针的概念随处可见。比如SPSP寄存器又叫堆栈指针它的值是地址由于SP保存的是地址并且SP的值是不断变化的因此可以看作一个变量而且是一个地址变量。地址也是C语言指针的值C语言的指针跟SP这样的寄存器虽然不完全一样但原理却是相通的。C语言的指针也是一种地址变量C89明确规定指针是一个保存对象地址的变量。这里要注意的是指针跟地址概念的不同指针是一种地址变量通常也叫指针变量统称指针。而地址则是地址变量的值。看到这里也许你会觉得这么简单的东西还用你来说吗的确对于p与p来说99的人都能在0.1秒内脱口而出谁是指针谁是地址但是又有多少人在使用指针的过程中能够始终如一毫不动摇地遵循这两个概念呢不少人使用指针的时候就会自觉或不自觉地把指针和地址两个概念混淆得一塌糊涂了数组名的滥用就是一个活生生的例子。这一点甚至连一些经典著作也没能避免。不过也不能全怪你自己笔者认为某些国内教材应该承担最大的责任。这些教材一开始就没有给读者好好地分清指针与地址的区别相反还在讲述的过程中有意无意地混用这两个概念。更有甚者甚至在书中明言指针就是地址说这话的家伙最应该在C语言这个地图上抹掉呵呵。两个月前我在购书中心随手翻开了某个作者主编的一本被冠以国家十五规划重点研究项目的书书里就是这么写的。当时笔者就感慨不知道又要有多少人的思想被这家伙强奸了。实际上地址这个东西本来就是一种基本数据类型本应该在介绍整数、浮点、字符等基本类型的时候把地址显式地放在一起讨论这样在后面介绍指针与数组的时候就能避免许多误解。可惜不少教材或者根本没有谈及或者就算提起这个类型也用了指针类型这个字眼。这就错了指针不是类型真正的类型是地址指针只是存储地址这种数据类型的变量打个比方对于inti1010是整数而i是存储整数的变量指针就好比这个i地址就好比那个10。指针能够进行加减法原因并不是因为它是指针加减法则不是属于指针这种变量的而是地址这种数据类型的本能正是因为地址具有加减的能力所以才使指针作为存放地址的变量能够进行加减运算。这跟整数变量因为整数能够进行加减乘除因而它也能进行加减乘除一个道理。那么数组名又应该如何理解呢用来存放数组的区域是一块在栈中静态分配的内存非static而数组名是这块内存的代表它被定义为这块内存的首地址。这就说明了数组名是一个地址而且还是一个不可修改的常量完整地说就是一个地址常量。数组名跟枚举常量类似都属于符号常量。数组名这个符号就代表了那块内存的首地址。注意了不是数组名这个符号的值是那块内存的首地址而是数组名这个符号本身就代表了首地址这个地址值它就是这个地址这就是数组名属于符号常量的意义所在。由于数组名是一种符号常量因此它是一个右值而指针作为变量却是一个左值一个右值永远都不会是左值那么数组名永远都不会是指针不管什么话只要说数组名是一个指针的都是错误的总之要牢牢记住数组名是一个地址一个符号地址常量不是一个变量更不是一个作为变量的指针在数组名并非指针这个问题上通常会产生两种疑问1。作为形参的数组不是会被转换为指针吗2。如果形参是一个指针数组名可以作为实参传递给那个指针难道不是说明了数组名是一个指针吗首先C语言之所以把作为形参的数组看作指针并非因为数组名可以转换为指针而是因为当初ANSI委员会制定标准的时候从C程序的执行效率出发不主张参数传递时复制整个数组而是传递数组的首地址由被调函数根据这个首地址处理数组中的内容。那么谁能承担这种转换呢这个主体必须具有地址数据类型同时应该是一个变量满足这两个条件的非指针莫属了。要注意的是这种转换只是一种逻辑看法上的转换实际当中并没有发生这个过程没有任何数组实体被转换为指针实体。另一方面大家不要被转换这个字眼给蒙蔽了转换并不意味着相同实际上正是因为不相同才会有转换相同的话还转来干吗这好比现在社会上有不少人变性一个男人可以转换为一个女人那是不是应该认为男人跟女人是相同的这不是笑话么。第二函数参数传递的过程本质上是一种赋值过程。C89对函数调用是这样规定的函数调用由一个后缀表达式称为函数标志符functiondesignator后跟由圆括号括起来的赋值表达式列表组成在调用函数之前函数的每个实际参数将被复制所有的实际参数严格地按值传递。因此形参实际上所期望得到的东西并不是实参本身而是实参的值或者实参所代表的值举个例来说对于一个函数声明voidfuninti我们可以用一个整数变量intn作实参来调用fun就是funn当然也正如大家所熟悉的那样可以用一个整数常量例如10来做实参就是fun10那么按照第二个疑问的看法由于形参是一个整数变量而10可以作为实参传递给i岂不就说明10是一个整数变量吗这显然是谬误。实际上对于形参i来说用来声明i的类型说明符int所起的作用是用来说明需要传递给i