网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月11日漏签0天
c语言吧 关注:801,919贴子:4,376,814
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 6回复贴,共1页
<<返回c语言吧
>0< 加载中...

关于结构体使用的一些总结

  • 只看楼主
  • 收藏

  • 回复
  • ToFourier
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
对于结构体类型有两种定义方式。
一种是直接定义
struct TEST
{
char a;
int b;
};
还有一种是我喜欢用的,用typedef生成一种新的类型
typedef struct
{
char a;
int b;
}TEST1;
比较一下两者在定义结构体变量时的区别。
struct TEST test;
TEST1 test1;


  • ToFourier
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一、结构体内存占用
这个对齐和编译器有关系。
// 内存对齐
typedef struct
{
int x;
float y;
char c;
}TEST;
// 字节对齐
#pragma pack(push) // 将当前pack设置压栈保存
#pragma pack(1)// 必须在结构体定义之前使用
typedef struct
{
int x;
float y;
char c;
}TEST_PACKED;
#pragma pack(pop) // 恢复先前的pack设置
字节对齐在keil里面使用另外一种方式
typedef __packed struct
{
int x;
float y;
char c;
}TEST_PACKED;


2026-03-11 06:36:52
广告
不感兴趣
开通SVIP免广告
  • ToFourier
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
// 占用内存测试
printf("数据类型大小:char:%d字节, int:%d字节, float:%d字节\n", sizeof(char), sizeof(int), sizeof(float));
printf("TEST大小:%d, 字节对齐TEST_PACKED大小:%d\n", sizeof(TEST), sizeof(TEST_PACKED));


  • ToFourier
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
内存对齐可以参考一下这篇文章,我随手百度出来的、http://blog.csdn.net/liukun321/article/details/6974282
按字节对齐,顾名思义就是,按照字节进行对齐,该是几个字节就用几个字节。
一般来说,按内存对齐,可以提高程序的执行效率,便于cpu进行处理。


  • ToFourier
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
二、结构体的比较
两种方式,一是逐元素比较,二是直接内存比较。
需要注意的是当结构体中含有指针成员时,这两种方式并不能比较指针所指向的内容。地址相同自然是相等的,但是如果地址不同,所指向两个地址的内容并不一定是相等还是不等。
// 比较测试
TEST test1,test2;
TEST_PACKED testPacked1,testPacked2;
test1.c = 'A';
test1.x = 5;
test1.y = 10.0;
test2.c = 'A';
test2.x = 5;
test2.y = 10.0;
// 逐元素进行比较
if (test1.c == test2.c && test1.x == test2.x && test1.y == test2.y)
printf("test1==test2\n");
else
printf("test1!=test2\n");
// 直接内存比较
if (memcmp(&test1, &test2, sizeof(TEST)) == 0)
printf("test1==test2\n");
else
printf("test1!=test2\n");


  • ToFourier
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
四、结构体指针
void fun1(TEST test)
{
printf("传入fun1的结构体内容为:test.c = %c, test.x = %d, test.y = %f\n", test.c, test.x, test.y);
}
void fun2(TEST* ptest)
{
printf("传入fun2的结构体指针所指向的结构体内容为:test.c = %c, test.x = %d, test.y = %f\n", ptest->c, ptest->x, ptest->y);
}
// 指向结构体的指针
TEST *pTest = &test1;
// 通过指针访问结构体成员
pTest->c = 'X';
pTest->x = 50;
pTest->y = 6.66;
printf("test1.c = %c, test1.x = %d, test1.y = %f\n", pTest->c, pTest->x, pTest->y);
// 结构体作为函数参数
fun1(test1);
// 结构体指针作为函数参数
fun2(&test1);


  • ToFourier
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
结束。以上是想到的用法总结。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 6回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示