sizeof 总结

来源:互联网 发布:apache安装成功 编辑:程序博客网 时间:2024/05/18 20:37
一、sizeof的概念
   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。
作用:
1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。
2、sizeof的另一个的主要用途是计算数组中元素的个数。
二、sizeof的使用方法
   1、用于数据类型

   sizeof使用形式:sizeof(type)

   数据类型必须用括号括住。如sizeof(int)。

   2、用于变量

   sizeof使用形式:sizeof(var_name)或sizeof var_name

   变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。

   注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

   如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。

三、sizeof的结果
   sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

   1、若操作数具有类型char、unsigned char或signed char,其结果等于1。

   ANSI C正式规定字符类型为1字节。

   2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为int 4、unsigned int 4、short int 2、unsigned short 2、long int 4、unsigned long 4、float 4、double 8、long double 12、char 1 、unsigned char 1。

   3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。

   4、当操作数具有数组类型时,其结果是数组的总字节数。

   5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。

   让我们看如下结构:

   struct {char b; double x;} a;

   在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。

   这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。

   6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

四、sizeof与其他操作符的关系
   sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。

五、sizeof的主要用途
   1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

   void *malloc(size_t size),

   size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

   2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:

   void * memset(void * s,int c,sizeof(s))。

六、建议

   由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。

例子:

char s1[]=""; char s2[]="Hello world!"; char *p = s2; char *q = s1; char *r = (char *)malloc(100); char str1[]="123456789"; char *a[]={"123","asdfsdf","0kle3340j"};  char s3[10]={'m','o','b','i','l'}; char s4[20]={'A','N','S','I','/0','C','+','+'}; char s5[8]={'I','S','O','C','+','+','M'}; int i; int j = 10; float f; float k=12.45; long l; double d;void func(char str[100]){ printf("sizeof---str=%d/n",sizeof(str));}int tenof(char par){ return par*10;}func(str);printf("tenof(100)=%d",tenof(100));printf("tenof(127)=%d",tenof(127));printf("tenof(128)=%d",tenof(128));printf("tenof('i')=%d",tenof('i'));

=========================================

sizeof(s1)=1
sizeof(s2)=13
sizeof(p)=4
sizeof(q)=4
sizeof(r)=4
sizeof(str)=4

strlen(s3)=5
strlen(s4)=4
strlen(s5)=7

sizeof(i)=4
sizeof(j)=4
sizeof(f)=4
sizeof(k)=4
sizeof(l)=4
sizeof(d)=8

sizeof(a)=12
sizeof(a[0])=4
sizeof(a[1])=4
sizeof(a[2])=4

sizeof---str=4
tenof(100)=1000
tenof(127)=1270
tenof(128)=-1280   //a error,ASCII code 000~127 is standard.
tenof('i')=1050

转自:http://blog.csdn.net/guo_wangwei/article/details/565044

http://blog.csdn.net/guo_wangwei/article/details/564996


原创粉丝点击