c语言中sizeof()的特点及用法

来源:互联网 发布:怎么查看手机端口号 编辑:程序博客网 时间:2024/05/18 03:03

        定义:sizeof是计算对象所占的字节数,通常用来查看变量、数组或结构体等所占字节个数的操作运算符。

     形式:sizeof()有三种语法形式:
1)用于数据类型:sizeof(type_name);//sizeof(类型);
2)用于变量:sizeof(object);//sizeof(对象);sizeof object;//sizeof 对象;
例:void main()
{
    int a=10;
    int x=sizeof(a);   
    x=sizeof(int);      
    x=sizeof a;         
    x=sizeof int;        ×
}

以上的四种语法形式中前三种sizeof()的表达是正确的,第四种是错误的,类型必须得加上括号。
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。
     特点及用法: 1)sizeof是运算符,不是函数;
2)sizeof不能求void类型的长度;
3)sizeof可以求void类型的指针的长度;
4)sizeof能求得静态分配内存的数组的长度;注意:用sizeof求字符串的长度时要加上末尾的'/0'
例:void fun(int array[10])
{
    int n=sizeof(array);
    return n;
}
运行结果:4
在fun类n的值为4,而不是40,这是因为在函数参数传递时,数组被转化成指针了,假如直接传递整个数组的话,那么必然涉及到数组元素的拷贝(实参到形参的拷贝),当数组非常大时,会导致函数执行效率极低,而只传递数组的地址(即指针),只需要拷贝4byte。
5)sizeof不能对不完整的数组求长度,否则会编译错误;
6)当表达式作为sizeof的操作数时,它返回的是表达式计算结果的类型大小,但是它不对表达式求值;
7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型(函数类型)的大小,但不是执行函数体;
8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和;
规则:a、结构体的大小等于结构体内最大成员大小的整数倍;
           b、结构体内的成员的首地址相对于结构体的首地址的偏移量是其类型的整数倍,比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数;
           c、为了满足规则a、b,编译器会在结构体成员之后进行字节填充;
例:#include
      using namespace std;
      int main()
 {
      struct  A
    {
      int num1=0;
      int name2=0;
      double num3=0;
    };
       struct B
     {
      int n1=0;
      double n2=0;
      int n3=0;
    };
      cout<<"A="<<sizeof(A)<<endl;
      cout<<"B="<<sizeof(B)<<endl;
      system("pause");
      return 0;
}
运行结果:
A=16
B=24
//分析:sizeof(A):4+4+8=16
             sizeof(B):4(n1占用地址空间)+4(不够8的倍数填充4个地址空间)+8(n2占用地址空间)+4(n3占用地址空间)+4(不够8的倍数填充4个地址空间)=24;
9)sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小;