指针和数组等价

在C语言中“指针和数组等价”到底是什么意思?

在c语言中对数组和指针的困惑多数都来自这一句话。说数组和指针“等价”并不表示他们相同,甚至也不能互换。他的意思是说数组和指针的算法定义使得可以用指针方便地访问数组或者模拟数组。换言之,正如Wayne Throop指出的,“在C语言中只是指针算术和数组下标运算等价,指针和数组是不同的”。

  特别的,等价的基础来自这个关键定义:
  一个T数组类型的对象如果出现在表达式中会退化为一个指向数组第一个元素的指针,指针的类型是指向T的指针。
  这就是说,一旦数组出现在表达式中,编译器会隐士的生成一个指向数组第一个元素的指针,就像程序员写出了&a[0]一样。当数组作为sizeof或&操作符的操作数,或者作为字符数组的字符串初始值的时候例外。

  由于这个定义,尽管数组和指针有很大区别,编译器并不那么严格区分数组下表操作符[]作用于数组和指针的不同。在形如a[i]的表达式中,根据上边的规则,数组退化为指针然后按照指针变量的方式如p[i]那样寻址。如果你把数组地址赋给指针:
 p=a;
那么p[3]和a[3]将会访问同样的元素。
    这种和谐的访问解释了指针如何访问数组,如何替代数组作为函数参数以及如何模拟动态数组。

既然他们这么不同,那么为什么作为函数形参的数组和指针声明可以互换呢?

这是一种便利的做法。
  由于数组会马上退化为指针,数组事实上从来没有被传入函数。允许指针参数声明为数组只不过是让他看起来好像传入了数组,因为该参数可能在函数内当做数组使用。具体来说,任何声明“看起来像”数组的参数,例如:
     void f(char a[]){
 ......}
   在编译器里都被看作指针来处理,因为在传入数组的时候,函数接收到的正式指针。
     void f(char *a){
 ......}
   如果函数本来就是用来操作数组的,或者参数在函数内部当做数组来使用的,那么声称函数接收数组没有什么不妥。
   这种转换仅限于函数形参的声明,别的地方并不适用。如果这种转换令你困惑,请避免他。很多程序员得出结论,让形参声明“看起来像”函数的调用形式或函数内部的用法所带来的困惑远远大于他所提供的小小方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值