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

来源:互联网 发布:hadoop大数据平台构建 编辑:程序博客网 时间:2024/04/28 00:42
           以前已经都提过了, 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
 
 
原创粉丝点击