sizeof的特点和用法

来源:互联网 发布:金蝶引出数据失败原因 编辑:程序博客网 时间:2024/05/17 06:52

基本数据类型char,int ,short  ,long int  ,float,double,long double,long long,bool(只有真和假两种值)0为假,其他全是真。

c语言的特点:(1)是强类型语言,必须先定义后使用。

(2)c语言的类型一旦被定义就不可改变。强转也不能改变其类型。

sizeof关键字(计算某个变量或者类型开辟的字节个数)

#include<stdio.h>

int main()

{

int a=10;

int x=sizeof(a);1

x=sizeof(int);2      1,2,3,等价都是计算整型a开辟的字节个数给x

x=sizeof a;3

//sizeof后面跟类型必须加上()

return 0;

}

Sizeof的特点和用法

sizeof是c语言的一种单目操作符。(运算符操作几个数就是几目运算符++,——,!等)

sizeof的使用方法

   1.用于数据类型

  sizeof的使用形式:sizeof(char)注意数据类型必须用括号。

2,用于变量

sizeof使用形式:sizeof(a)或者 sizeof a都是正确的形式,但是大多的人都会带上括号。

3.*s izeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型,size_t是后者用typedef机制创建的别名。如sizeof(max)若此时变量max定义为int max(), sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。  

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

5.当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

6.sizeof(ar)计算整个数组空间大小或者字节个数(sizeof能求得静态分配的内存的数组的长度。

除了sizeof外数组名代表数组首元素的地址。

7 sizeof不能求得void类型的长度。

8sizeof能求得void类型的指针的长度。

9sizeof不能求得动态分配的内存的大小

10sizeof不能对不完整的数组求长度

11 当表达式作为sizeof的操作数时,它返回表达式的计算类型大小,但是它不对表达式求值。

char ch=1;

int num=1;

int n1=sizeof(ch+num);           //结果n1=4默认转换为整型

intn2=sizeof(ch=ch+num);     //n2=1,ch=1

11sizeof可以对函数调用求大小,并且求得的大小等于函数返回类型的大小,但是不执行函数体。

int fun(int &num)

{

  int a,b;

  a = 10;

  b = 2;

  num = a/b;

  return num;

}

int main()

{

  int num = 0;

  cout<<sizeof(fun(num))<<endl;

  cout<<num<<endl;

  return 0;

}//输出结果4

sizeof(fun(num))得到的是函数返回类型的大小,而fun(num)的返回值类型是int,所以等价于sizeof(int)得到结果为4.另外不要认为这个长度为fun函数内部的局部变量所占空间的大小(认为结果为8,即a和b两个int的长度也是错误的)另外也注意,sizeof(fun(num))也不是求函数指针的大小,切记是求得返回值类型的长度大小。

12sizeof求得结构体(及其对象)的大小并不等于各个数据成员对象的大小之和

结构体的大小跟结构体成员对其有密切关系,而并非简单地各个成员的大小之和。比如两个结构体AA和BB。,使用sizeof分别得出结果是24和16.可以看出sizeof(AA)并不等于sizeof(int)+sizeof(double)+sizeof(int)

struct AA{

       int aa;

       double bb;

       int cc;

};

struct BB{

       int aa;

       int bb;

       double cc;

};

结构体成员对齐的规则:(1)结构体大小等于结构体内最大成员大小的整数倍;(2)结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说double型成员相对于结构体的首地址的偏移量应该是8的整数倍;(3)为了满足规则1和规则2编译器会再结构体成员之后进行字节填充。

在进行设计时,组号仔细安排结构体中各个成员的顺序。

13sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小。

位域:类型的大小都是以字节(byte)为基本单位的,比如sizeof(char)为1byte。但是bool类型取值只有true和false,按理只用1bit就够了,但事实上sizeof(bool)等于1.为了提供一种能对变量的存储空间进行精打细算的机制,这就是位域。简单来说在结构体成员变量后面跟上的一个冒号+一个整数,就代表位域,请仔细看以下结构体:

struct A{

         boolb:1;

         charch1:4;

         charch2:4;

}item;

该结构体试图让bool类型的变量b只占用1个bit,让ch1和ch2分别只占用4个bit,以此来达到对内存精打细算的功能。语句sizeof(item.b)和sizeof(item.ch1)等对位域成员求大小的语句均不能通过编译。其原因:sizeof以byte为单位返回操作数的大小。

对包含位域的结构体可以使用sizeof求其大小,但其求值规则比较复杂,不涉及到成员对齐,还与集体编译环境有关。

延伸:class A{};sizeof(A)的结果为1,其原因:类的实例化是在类内存中分配一块地址,每个实例在内存中得都有独一无二的地址,同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以其长度为1。(编译器为了区分不同的类,在类中加了一个char类型,另外,如果一个文件中有256个空类,即大于char类型表示的范围,就不能区分空类了)

函数与操作符的区别就在于,函数是程序运行是动态计算出一个对象或者类型所占的内存字节数,然而sizeof()操作符是在编译的时候就把字节数计算好,然后把这个字节数编译进行程序。它的实现是编译器的工作。这个数是一个常量。

原创粉丝点击