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

饥民2011

一直在搬砖

 
 
 

日志

 
 
 
 

C语言中, 有些时候数值名并不与指针等价.  

2013-02-21 22:02:03|  分类: c/c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
           以前已经都提过了, c语言中,数组名就是1个指向数组第1个元素地址的指针.
           如数组char a[] = "bcd";
           数组名a 就是指向数组a[]的第1个元素a[0]的地址
           所以*a==a[0]=='b'

          当我们定义1个新的指针p,并给它赋值时:
           p=a;

           一般来讲我们认为他们p与a是等价的
          因为同样有: *p==p[0]='b'
          p[i]=a[i]


    但是有特殊情况, 要将数组名a看成1个特殊的指针.

         例如函数sizeof , 这是取1个对象(变量or常量) 的内存占用空间
          举个例子:
          定个1个字符数组c:
          char c[]="abcdefghikjlmn";

         那么sizeof(c) 得出的是数组c的所占内存空间,也就是c所有元素占的长度(包括最后的隐藏元素'\000').
         所以
         sizeof(c) == 15   //因为c是字符数组, 每1个字符占的长度是1字节(byte)啦

         跟着定义1个指针p,并赋值:
         p=c;
        
         而size(p) 是求p本身所占的内存空间, 也就是1个内存单位
         sizeof(p) == 8  // 64位gcc, 32位gcc是4, 因为对于每1个内存单位来讲,64位的内存单位长度是32位的一倍.

         那么数组c 是不是容易都是特殊指针呢. 不是, 当他作为1个参数被传入时, 系统会将这个参数转为一般化指针:
 
         例如我定义1个新函数:
         long int getlen(char* a){
               return sizeof(a);
         }

         执行 getlen(c) 时, 实际是也会执行size(c), 但是因为这时数组名c作为参数已经被转为一般的函数, 所以getlen函数里面的sizeof(c)求的是c指针本身所占的内存空间, 也就是8啦.

见如下例子:


C语言中, 有些时候数值名并不与指针等价. - 饥民 - 饥民2011

输出:
C语言中, 有些时候数值名并不与指针等价. - 饥民 - 饥民2011
 
下面这个是相同代码在32位gcc环境下的输出:
C语言中, 有些时候数值名并不与指针等价. - 饥民 - 饥民2011
 
 
  评论这张
 
阅读(113)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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