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

           以前已经都提过了, 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
 
 

转载于:https://www.cnblogs.com/nvd11/archive/2013/04/02/2996786.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值