C的结构

 

在内存中,结构不一定是它表面看起来那么大。

typedef struct

{

char abc[2];

int i;

} ABC;

printf("%d/n",sizeof(ABC));//结果为 8

注:

具体的大小依赖于编译器的字节对齐情况。有些编译器甚至会调整结构中的成员的排列顺序。

 

即使空结构,也不会为0字节,可能是避免为零时,空结构的地址就等于紧接它的数据的地址。

typedef struct

{} EMPTY //VC下,sizeof(EMPTY)1

-----------------------------------------------------------------------------------------

结构是传值。

C的结构'='为赋值操作,

typedef struct {int x,int y} Long64

Long64 a, b;

a=b;

但不能赋予不同类型的值,即使类型的总位数相同。

long long c=0;

a = c;// 报告不兼容类型

 

本来相同的就可以,如

typedef int jint;

int i=0;

jint j=0;

i=j; // correct

-----------------------------------------------------------------------------------------

可以初始化结构

struct Shape

{

int type

float radius

} Circle = {12}

 

结构允许嵌套

struct

{

struct

}

 

结构的继承

CLDC中的:

struct filePointerStruct {

/* If set to true, indicates a JAR file */

bool_t isJarFile;

};

 

struct stdioPointerStruct {

bool_t isJarFile;

/* Always TRUE */

long   size;

 

/* size of file in bytes */

FILE*  file;

 

/* Pointer to class file */

};

 

struct jarPointerStruct {

bool_t isJarFile;

/* always FALSE */

long dataLen;

 

/* length of data stream */

long dataIndex;

 

/* current position for reading */

unsigned char data[1];

};

在使用时可以用 (struct jarPointerStruct*)ClassFile;类似面向对象的强制类型转换。

注意:它的结构前面的共有部分要相同。

-----------------------------------------------------------------------------------------

段位结构

struct Date

{

unsigned month:4;

unsigned day:5;

unsigned year:7;

} date;

 

如果没有用到一个字节的所有位,则不用的位初始为零。假如,赋予的字段的值溢出,在VC下不会进位到下一个字段。

 

typedef

union _ABC

{

int i;

struct

 

{

short s1:1;

short s2:2;

};

} abc;

联合和结构中,指定位数只能指定小于或等于类型的长度。

如:

short s2:24 就有错,因为short只有16位长。

同时,对s1和s2赋值只影响其声明的位,如s1=3并不会溢出存到s2。

而且,段的类型仍然为定义时的类型,不会因为只涉及其中的一部分位而消失。

---------------------------------------------------------------------------------

见到有些结构故意填加字节,使结构边界对齐(不依赖于编译器)

typedef struct

{

U16 data;

U8 len; 

U8 pad;  // here

} SatSmsPdu;

 

---------------------------------------------------------------------------------

拷贝结构部分的方法

 

struct A{int i; int j;};

struct A sa, sb;

memcpy(&sa, &sb, &(((struct A*)0)->j)); //拷贝前面部分到j

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值