注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

数组指针漫谈(二)  

2014-08-09 22:01:47|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

对于编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。

什么时候数组和指针相同的。

1、表达式中的数组名(与声明不同)被编译器当做一个指向该数组第一个元素的指针。

2、下标总是与指针的偏移量相同。

3、在函数参数的声明中,数组名被编译器当做指向该数组第一个元素的指针。

对数组的引用,如a[i]在编译时总是被编译器改写成*(a+i)的形式。另外,数组的取下标操作符的操作数是可以互换的,如a[i]也可以写成i[a]

为什么C语言把数组形参当做指针?

把作为形参的数组和指针等同起来是出于效率原因的考虑。C中,所有非数组形式的数据实参均以传值形式调用(对实参做一份拷贝并传递给调用的函数,函数不能修改作为实参的实际变量值,只是修改传递给它的那份拷贝)。如果要拷贝整个数组,那开销是很大的,绝大多时候,只是需要告诉函数特定时候对哪个特定数组有用。这时候可以考虑的方法是在形参上增加一个存储说明符,表示它是传值调用还是传递地址调用,如果都作为地址调用,那么便会简化编译器。因此,函数的返回值绝不能是一个数组,而只能是指向数组或函数的指针。

另外,数组和指针参数是如何被编译器修改的呢?

数组会被改写为指针,而数组的数组会被改写为数组的指针,而不是指针的指针。由于数组下标[]优先级高于指针符号*

数组的数组  char arr[4][5];  改为 数组的指针 char (*arr)[5];

指针数组    char *arr[5];   改为 指针的指针  char **arr;

数组指针    char (*arr)[5];   不作改变

指针的指针  char **arr;   不作改变

我们在main()函数中看到的第二个参数 **argv ,等价于 *argv[] ,也等价于 **argv ,而不是 (*argv)[]

数组指针漫谈(二) - mihooke - mihooke的博客
  评论这张
 
阅读(82)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017