第一章 数据类型

来源:互联网 发布:淘宝买高压气瓶犯法吗 编辑:程序博客网 时间:2024/05/20 22:38

32 位系统上 char 1 byte;  Shor  2 byte ; int  long  float   4 byte ;double 8 byte

一般如上,不同平台可能不一样,具体可以用sizeof求一下。


Siezof在计算变量所占空间大小时,括号可以省略,而计算类型大小时不能省略。

sizeofi,sizeof i, sizeof(int) 。错误情况如下sizeof int 

 

int *p=NULL;  Sizeof(p)=4 ;sizeof(*p)=4p是指针,其sizeof4*p代表值

Int  a[100] ;sizeof(a)=400;sizeof(a[100])=4,sizeof(&a)=400;sizeof(&a[0])=4; 地址为int型,int型的范围和开发环境有关,现在都是32位的,远远超出65535.

 

Int b[100] 

void fun(int b[100])  数组传递时,传递的是头指针。

{

Sizeof(b)=4

}

 

 

Char *q=”ancdedffg”; sizeof(q)=4; sizeof(*q)=1;  q是字符指针,*q是第一个字符

char c[]="abdded";sizeof(c)=7 strlen(c)=6; 包括‘\0.sizeof("abcdefg")=8 

char x[10]="abcdef";printf("%d",strlen(x));strlen(x)=6 ;printf("%d",sizeof(x));sizeof(x)=10

 

 

struct MyStruct
{
   char dda;     偏移量为0,满足对齐方式,dda占用1个字节;
   double dda1;  下一个可用的地址的偏移量为1,不是sizeof(double)=8
                的倍数,需要补足7个字节才能使偏移量变为8(满足对齐
               方式),因此VC自动填充7个字节,dda1存放在偏移量为8
               的地址上,它占用8个字节。
   int type; 下一个可用的地址的偏移量为16,是sizeof(int)=4的倍
              数,满足int的对齐方式,所以不需要VC自动填充,type
              存放在偏移量为16的地址上,它占用4个字节。

};   

所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为sizeof(double)=8的倍数。

所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。

struct MyStruct

{

double dda1;

char dda;

int type;

};

sizeof(MyStruc)为8+1+3+4=16。

 

 

 

 

 

struct MyStruct

{

static double dda1;

 char dda;

int type;

};

SizeofMyStruct=8。因为结构或者类中的静态成员不对结构或者类的大小产生影响,静态变量的存储位置与结构或者类的实例地址无关。

总体上遵循两个原则:

1.整体空间是占用空间最大的成员所占字节数的整数倍

2.数据对其原则。内存按结构成员的先后顺序排列,当排列到该成员变量时,其前面已摆放的空间大小必须是该类型大小的整数倍,如果不够则补齐,以此向后类推。

 double *(*a)[3][6]

sizeof(a)=4   ;//a为指针

sizeof(*a)=72 ;//*a为一个有3*6个指针元素的数组

sizeof(**a)=24 ;//**a为一个数组一维的6个指针

sizeof(***a)=4 ;//***a为一维的第一个指针

 sizeof(****a)=8 ;//****a为一个double变量


 

struct s1

{

char a[8];

};

 

struct s3

{

s1 s;

char a;

};

Sizeofs3=9,对齐方式是1.

0 0
原创粉丝点击