C-结构体 -struct

float PosX;
float PoxY;

};

int main()
{
//创建PlayerInfo类型的结构体,并使用初始化列表进行初始化(szName=“wolven”,nHP=500,PosX=50.32f,PosY=100.34f)

struct _PlayerInfo PlayObj = { “wolven”,500,50.32f,100.34f };  
printf(“%s\r\n”, PlayObj.szName);//打印结果为wolven

//对某个成员变量进行修改
PlayObj.nHP = 1000;
printf(“%d\r\n”, PlayObj.nHP);//打印结果为1000

//指针指向结构体
struct _PlayerInfo * pPlayObj; //声明结构体指针
pPlayObj = &PlayObj; //指针指向PlayObj结构体
printf(“%f\r\n”, pPlayObj->PosX);
printf(“%f\r\n”, pPlayObj->PosY);

system("pause");
return 0;
}


//指针指向结构体
struct _PlayerInfo * pPlayObj; //声明结构体指针
pPlayObj = &PlayObj; //指针指向PlayObj结构体
printf(“%f\r\n”, pPlayObj->PosX);
printf(“%f\r\n”, pPlayObj->PosY);


总结:常规结构体访问成员变量使用 ” . “;指针指向结构体的地址进行成员变量访问时使用"->";也可以使用地址的形式进行成员变量的访问。



printf("%d\r\n", PlayObj.nHP);


printf(“%d\r\n”, (&PlayObj)->nHP);

printf("%f\r\n", pPlayObj->nHP);

//打印的结果都为1000



为结构体变量申请内存(需要用到malloc函数)注意包含malloc.h头文件



Eg:
//定义结构体_PlayerInfo
struct _PlayerInfo
{
char szName[50];
int nHP;
float PosX;
float PoxY;
};

int main()
{
//为空结构体申请内存
struct _PlayerInfo * pPlayerObj_B = malloc(sizeof(struct _PlayerInfo));
初始化
pPlayerObj_B->nHP = 5000;
printf(“%d”,pPlayerObj_B->nHP);//打印结果为5000
}


在一般情况下,结构体内存是连续分配的。这意味着结构体中的各个成员变量在内存中是按照声明的顺序依次排列的,没有间隔或填充。这样设计的好处是可以通过结构体的首地址和成员变量的偏移量来访问结构体的各个成员。


但是,结构体内存连续与否还受到编译器的影响,编译器可能会在结构体中添加一些填充字节以满足对齐要求,以提高访问速度。这样可能会导致结构体的大小比成员变量的大小之和要大,但结构体的内存仍然是连续分配的。



###### typedef为结构体定义新名称



typedef 是C语言中的一个关键字,用于为已有的数据类型(包括基本数据类型、结构体、枚举等)定义新的名称(别名)。


它的语法形式为:



typedef 原类型 新类型名;


使用 `typedef` 可以方便地为复杂的数据类型定义更简洁、易于理解的别名,提高代码的可读性和可维护性。



在结构体定义的时候我们可以使用typedef定义结构体的新名称(包含指针别名):



typedef struct _PlayerInfo {
char szName[50];
int nHP;
float PosX;
float PosY;
}PlayerInfo,*pPlayerInfo; //别名1,别名2;


定义完别名后就可以按照如下方式进行结构体的使用:



PlayerInfo 就相当于 typedef struct _PlayerInfo
PlayerInfo PlayObj;

//声明结构体指针
pPlayerInfo 就相当于 struct _PlayerInfo *
pPlayerInfo pPlayObj;


#### 位域结构体



位域结构体(Bit-field struct)是C语言中一种特殊的结构体,它允许将结构体的成员按照位来存储,以实现对内存的更加精细的控制。


案例:



struct
{
int a : 8; //使用8位存储a
int b : 8; //使用8位存储a
int c : 8; //使用8位存储a
int d : 8; //使用8位存储a

}wl;
wl.a = 0x78;
wl.b = 0x56;
wl.c = 0x34;
wl.d = 0x12;

printf(“0x%X”, wl);

输出位0x12345678


这段代码定义了一个位域结构体,该结构体包含了四个成员变量 `a`、`b`、`c` 和 `d`,每个成员变量都被声明为8位宽度的位域,表示每个成员变量只占用一个字节的存储空间。


然后,创建了一个名为 `wl` 的结构体变量,并为其成员变量赋值:


* `wl.a = 0x78;` :给 `a` 成员赋值为十六进制数 `0x78`,其二进制表示为 `0111 1000`。
* `wl.b = 0x56;` :给 `b` 成员赋值为十六进制数 `0x56`,其二进制表示为 `0101 0110`。
* `wl.c = 0x34;` :给 `c` 成员赋值为十六进制数 `0x34`,其二进制表示为 `0011 0100`。
* `wl.d = 0x12;` :给 `d` 成员赋值为十六进制数 `0x12`,其二进制表示为 `0001 0010`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值