您的位置:首页 > 编程语言 > C语言/C++

c语言 数组中的sizeof()

2016-07-23 10:32 337 查看
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()));           //正确  输出 4
printf("%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表示整个数组  大小为  6
printf("%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参与运算 降级使用 成为 第一行 的地址
//          *解引用表示第一行(三个元素) 的大小  所以为3
printf("%d\n",sizeof(a[2]));   //     3    a[2] 越界但是不影响 <span id="transmark"></span>相当于一维数组的数组名 表示第三行的大小  </span><span id="transmark"></span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: