c语言 数组中的sizeof()

来源:互联网 发布:淘宝店一件代发赚钱么 编辑:程序博客网 时间:2024/04/30 20:45

MSDN上sizeof的解释:Thesizeof operator gives the amount of storage, in bytes, required to store an object of the type of the operand(sizeof运算给出的存储量,以字节为单位来存储操作数的类型的对象必需的。)

简单的说其实sizeof()的作用:返回一个对象或者类型所占的内存字节数。

          float   4 个字节    double    8个字节

          short   2 个字节    long     4个字节

          long long  8个字节

     指针: 指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。在32位计算机中,一个指针变量的返回值必定是4个字节指针变量的sizeof值与指针所指的对象没有任何关系。


实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的
不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以
对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式
进行计算
。如:
sizeof( 2 );// 2的类型为int,所以等价于 sizeof( int );
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );

不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,

sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用 




<span style="font-size:18px;"><span style="font-size:14px;">void  fun1(){}int fun(){return 1;}struct F{unsigned int f1 : 1;int na;};int main(){printf("%d",sizeof(fun));//错误 sizeof 的操作数不能是函数printf("%d", sizeof(fun()));           //正确  输出 4printf("%d", sizeof(fun1()));         //错误 不允许使用不完整的类型printf("%d", sizeof(F.na));          //错误 未定义的标示符"F"system("pause");return 0;}</span></span>

  

文章的重点内容来了 : 数组中的 sizeof() 

数组的sizeof值等于数组所占用的内存字节数。 :

注意::不可以在自定义函数(带数组参数)中用sizeof 求数组的大小 

   在所有使用数组名的表达式中,数组名的值是一个指针常量(注意不是指针变量),也就是数组第1个元素的地址。

   在两种情况下,数组名不用指针常量来表示(表示整个数组的地址)——当数组名作为sizeof操作符或单目操作符&的操作数。

一维数组:

   

<span style="font-size:18px;">//   数组名表示整个数组: 只有在sizeof 中单独使用   与 &操作符使用      char  a[4] = {'1','2','3','4'};printf("%d\n",sizeof(a));         //     4    a代表整个数组  ,  数据类型char 的大小* 数组大小printf("%d\n", sizeof(a+0));      //     4    a降级使用 表示首元素的地址,  地址 的大小 就是4 个字节printf("%d\n", sizeof(*a));       //     1    a降级使用 表示首元素的地址 *解引用 表示第一个元素‘1’ printf("%d\n", sizeof(a+1));      //     4    a降级使用 表示首元素的地址, +1表示以前面的标准(一个元素)      //          <span style="font-size:24px;"><span style="font-family:SimSun"></span></span>                                 //    向后移一位 此时表示第二个元素的地址地址的大小就是4 个字节<span style="font-size:24px;"><span style="font-family:SimSun"></span></span>printf("%d\n", sizeof(a[1]));     //     1     表示第一个元素‘1’  char类型 所以 大小为1  printf("%d\n", sizeof(&a));       //     4     &表示取地址 相当于指针 所以大小为4                                   //      注意: 此时 a 表示整个数组 ,所以 此时的地址为整个数组的地址printf("%d\n", sizeof(&a+1));   //     4     此时 a 表示整个数组 ,&a 表示整个数组的地址                                // +1  表示以前面的标准(整个数组) 向后移一位,此时地址为下一个数组的地址printf("%d\n", sizeof(&a[0]));    //     4     表示第一个元素的地址printf("%d\n", sizeof(&a[0]+1));  //     4    +1  表示以前面的标准(一个元素) 向后移一位                                    //此时表示第二个元素的地址</span>

二维数组  :

    数组名表示整个数组: 只有在sizeof 中单独使用 或者和&操作符使用

  
   数组名参与运算要发生降级  比如说a[0] a[1]也表示数组名 ,此时表现为一维数组


 

      <span style="font-size:18px;">  //   数组名表示整个数组:只有在sizeof 中单独使用  或者   和&操作符使用    //   数组名参与运算要发生降级  比如说a[0] a[1]  也表示数组名char a[2][3] = { '1','2','3','4','5','6',};printf("%d\n",sizeof(a));       //   6   a表示整个数组  大小为  6printf("%d\n", sizeof(a+1));    //   4   a参与运算 降级使用 表示第一行的地址,                                <span style="font-size:24px;"><span style="font-family:SimSun"></span></span>                               <span id="transmark"></span>//      +1表示以前面的标准(一行元素)向后移一位so表示第二行的元素的地址<span style="font-size:24px;"><span style="font-family:SimSun"></span></span>                               printf("%d\n",sizeof(a[0]));    //   3    a[0] 表示第一行 相当于一位数组的数组名printf("%d\n",sizeof(a[0]+1));  //   4    a[0]参与运算 降级使用成为a[0][0]                                 //        +1表示以前面的标准(一个元素) 向后移一位 所以表示a[0][1]的地址printf("%d\n",sizeof(&a[0]+1)); //   4    &a[0] 表示第一行的地址                                 //         +1表示以前面的标准(一行元素)向后移一位所以表示为第二行的地址printf("%d\n",sizeof(*a));     //     3    a参与运算 降级使用 成为 第一行 的地址                               //          *解引用表示第一行(三个元素) 的大小  所以为3printf("%d\n",sizeof(a[2]));   //     3    a[2] 越界但是不影响 <span id="transmark"></span>相当于一维数组的数组名 表示第三行的大小  </span><span id="transmark"></span>





1 0