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

Mihooke's blog

IT之恋

 
 
 

日志

 
 

数组、指针漫谈(一)  

2014-07-31 22:00:50|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       为什么指针和数组是可以互换呢?那就是对数组的引用总可以写成对指针的引用。因此好多程序员新手就这样认为指针和数组时一样的。这是很荒谬的。只要我们稍微深入一点学习指针和数组便不会这样认为了。

首先要明白,


int *p;

q=*p;


定义了一个指针p,并把该指针指向的值赋给变量q,编译器进行该指针解释的时候是:编译器符号表中有一个p,存放p的地址是address1,然后取address1中的内容address2,然后再指向地址address2中的内容value,这就是对一个指针引用的整个过程。则p表示该指针指向的地址,*p则表示该地址存放的int 型数值,即value,最后赋给变量q

而数组


int a[100];


编译器在对a[i]取值的时候,是:先取得a[100]的首地址address3然后再进行地址偏移,address3+i这就是a[i]的地址了。有一点值得注意,那就是数组名a表示的是数组a[100]的首地址。


只是理解这一点似乎很容易,但在实际编程中,做到这些就显得力有不足了,所以要从一开始就养成良好的编码习惯,这是很重要的。这里要做的是 声明和定义相匹配。比如:

文件1中:

extern int a[]; //这是声明,但是没有长度

在文件2中定义的时候,只要:

int a[100];

即可,表示a数组的定义分配了100int的空间,并且是100个连续的内存空间,而

int *p;

则申请了一个地址容纳该指针,指针名字是p,它可以随意指向任何一个int型变量。

指针和数组在定义字符串常量的时候也不一样,尽管看上去一样,效果也一样,但是底层的机制确实不相同的。创建一个字符串常量:


char *p="abcdefg";


当只定义p而没有初始化的时候,编译器只分配了存储该指针的地址,如上文提到的address2。当进行初始化之后,便把字符串分配给了编译器内一个叫常量区的内存块,在以后的程序中,对该字符串进行的访问都是该常量区的原串的访问,是不能修改的,修改会出error。在ANSI C中,初始化的字符串常量是read-only,不允许修改的。

数组初始化:


char a[]="abcdefg";


随之,编译器便为数组a分配了8个char类型空间存储字符串,并把字符串常量存储到常量区的内存块中,对该字符串的访问就是对该常量区中存放的字符串的一份拷贝的访问,并且,还可以用a[i]来对数组第i个元素进行修改。


顺便说一下,用指针和数组当做函数返回值的情况是完全不一样的,有兴趣的读者可以自己写小程序进行验证。

  评论这张
 
阅读(47)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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