c语言怎么返回c语言结构体数组

1135人阅读
今天心血来潮,想弄清楚C语言的返回值为结构体,那它是怎么返回这些结构体的。
写了个简单的程序
#include &stdio.h&
struct abc
struct abc Ret()
&&& temp.a = 1;
&&& temp.b = 2;
&&&&&&&&&&&&&&&&&&& //根据反汇编的结果,在这里已经把temp的内容复制到下面main里的temp1了
int main()
&& struct abc temp1;
&& temp1 = Ret();&&&&&&&&&&& //表面上应该在这里复制Ret函数里的值的,其实在上面的Ret函数还没有返回的时候这一个赋值已经做完了
&& printf(&%d,%d\n&, temp1.a, temp2.b);
temp1 = Ret(); 这一个语句里有一个玄机:
这个语句翻译成汇编之后和我们看到的C语言代码就不一样了,真实的情况是汇编之后这个语句被改变了,从反汇编之后的代码来看的话,这个语句变成了这样:
Ret(&temp1);
看见了吧,明明这个函数是没有参数的,结果temp1变量的地址作为参数传到了Ret函数里面去了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:44064次
排名:千里之外
原创:23篇
(1)(1)(1)(1)(1)(1)(4)(2)(9)(5)漫谈c语言结构体
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
漫谈c语言结构体
&相信大家对于结构体都不陌生。在此,分享出本人对语言结构体的研究和学习的总结。如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了。当然,水平有限,若发现不足之处恳请指出。代码文件我放在下面。
在此,我会围绕以下个问题来分析和应用语言结构体:
1.&C语言中的结构体有何作用
2.&结构体成员变量内存对齐有何讲究重点
对于一些概念的说明,我就不把语言教材上的定义搬上来。我们坐下来慢慢聊吧。
==============================================================================================================================================
1.&结构体有何作用
三个月前,教研室里一个学长在华为南京研究院的面试中就遇到这个问题。当然,这只是面试中最基础的问题。如果问你你怎么回答?
我的理解是这样的,语言中结构体至少有以下三个作用:
(1)有机地组织了对象的属性。
比如,在的开发中,我们需要数据来表示日期和时间,这些数据通常是年、月、日、时、分、秒。如果我们不用结构体,那么就需要定义个变量来表示。这样的话程序的数据结构是松散的,我们的数据结构最好是&高内聚,低耦合&的。所以,用一个结构体来表示更好,无论是从程序的可读性还是可移植性还是可维护性皆是:
typedef&struct&&&//公历日期和时间结构体
&&&&vu16 &
&&&&vu8&&&
&&&&vu8&&&
&&&&vu8&&&&
}_calendar_&
&_calendar_obj&&&//定义结构体变量
(2)以修改结构体成员变量的方法代替了函数入口参数的重新定义。
如果说结构体有机地组织了对象的属性表示结构体&中看&,那么以修改结构体成员变量的方法代替函数入口参数的重新定义就表示了结构体&中用&。继续以上面的结构体为例子,我们来分析。假如现在我有如下函数来显示日期和时间:
void&DsipDateTime(&_calendar_obj&&DateTimeVal)
那么我们只要将一个这个结构体类型的变量作为实参调用即可,通过的成变量来实现内容的显示。如果不用结构体,我们很可能需要写这样的一个函数:
void&DsipDateTime(&vu16 year,,,,,
显然这样的形参很不可观,数据结构管理起来也很繁琐。如果某个函数的返回值得是一个表示日期和时间的数据,那就更复杂了。这只是一方面。
另一方面,如果用户需要表示日期和时间的数据中还要包含星期周,这个时候,如果之前没有用机构体,那么应该在函数中在增加一个形参:
void&DsipDateTime(&vu16 year,,,vu8&week,,,可见这种方法来传递参数非常繁琐。所以以结构体作为函数的入口参数的好处之一就是
函数的声明不需要改变,只需要增加结构体的成员变量,然后在函数的内部实现上对作相应的处理即可。这样,在程序的修改、维护方面作用显著。
typedef&struct&&&//公历日期和时间结构体
&&&&vu16 &
&&&&vu8&&&
&&&&vu8&&&
&&&&vu8&&&&
}_calendar_&
&_calendar_obj&&&//定义结构体变量
&&&&(3)结构体的内存对齐原则可以提高对内存的访问速度以空间换取时间。
&&&&并且,结构体成员变量的地址可以根据基地址以偏移量offset)计算。我们先来看看下面的一段简单的程序,对于此程序的分析会在第部分结构体成员变量内存对齐中详细说明。
#include&stdio.h&
int main()
//声明结构体char_short_long
}char_short_
//声明结构体long_short_char
}long_short_
//声明结构体char_long_short
}char_long_
printf(& \n&);
printf(& Size of char
= %d bytes\n&,sizeof(char));
printf(& Size of shrot
= %d bytes\n&,sizeof(short));
printf(& Size of long
= %d bytes\n&,sizeof(long));
printf(& \n&); //char_short_long
printf(& Size of char_short_long
= %d bytes\n&,sizeof(char_short_long));
Addr of char_short_long.c = 0x%p (10进制:%d)\n&,&char_short_long.c,&char_short_long.c);
Addr of char_short_long.s = 0x%p (10进制:%d)\n&,&char_short_long.s,&char_short_long.s);
Addr of char_short_long.l = 0x%p (10进制:%d)\n&,&char_short_long.l,&char_short_long.l);
printf(& \n&);
printf(& \n&); //long_short_char
printf(& Size of long_short_char
= %d bytes\n&,sizeof(long_short_char));
Addr of long_short_char.l = 0x%p (10进制:%d)\n&,&long_short_char.l,&long_short_char.l);
Addr of long_short_char.s = 0x%p (10进制:%d)\n&,&long_short_char.s,&long_short_char.s);
Addr of long_short_char.c = 0x%p (10进制:%d)\n&,&long_short_char.c,&long_short_char.c);
printf(& \n&);
printf(& \n&); //char_long_short
printf(& Size of char_long_short
= %d bytes\n&,sizeof(char_long_short));
Addr of char_long_short.c = 0x%p (10进制:%d)\n&,&char_long_short.c,&char_long_short.c);
Addr of char_long_short.l = 0x%p (10进制:%d)\n&,&char_long_short.l,&char_long_short.l);
Addr of char_long_short.s = 0x%p (10进制:%d)\n&,&char_long_short.s,&char_long_short.s);
printf(& \n&);
程序的运行结果如下注意:括号内的数据是成员变量的地址的十进制形式:
2.&结构体成员变量内存对齐
首先,我们来分析一下上面程序的运行结果。前三行说明在我的程序中,型占个字节,型占个字节,型占个字节。、和是三个结构体成员相同但是成员变量的排列顺序不同。并且从程序的运行结果来看,&
&&&&Size&of long_short_char&=&8&bytes
&&&&Size&of char_long_short&=&12&bytes&&//比前两种情况大!
& & 并且,还要注意到,1 byte (char)+&2&byte&(short)+&4 byte&(long) = 7 byte,而不是8 byte。
& &所以,结构体成员变量的放置顺序影响着结构体所占的内存空间的大小。一个结构体变量所占内存的大小不一定等于其成员变量所占空间之和。如果一个用户程序或者操作系统比如中存在大量结构体变量时,这种内存占用必须要进行优化,也就是说,结构体内部成员变量的排列次序是有讲究的。
结构体成员变量到底是如何存放的呢?
在这里,我就不卖关子了,直接给出如下结论,在没有宏的情况下:
原则&&结构(或联合)的数据成员,第一个数据成员放在为的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如在位机为4字节,则要从的整数倍地址开始存储)。
原则2&&结构体的总大小,也就是的结果,必须是其内部最大成员的整数倍,不足的要补齐。
&&&*原则3&&结构体作为成员时,结构体成员要从其内部最大元素大小的整数倍地址开始存储。(里存有,里有,,等元素时,那么b应该从的整数倍地址处开始存储,因为sizeof(double)&=&8&bytes)
这里,我们结合上面的程序来分析暂时不讨论原则。
先看看char_short_long和这两个结构体,从它们的成员变量的地址可以看出来,这两个结构体符合原则和原则。注意,在
再看看这个结构体,的地址分布情况如下表:
成员变量十六进制地址
成员变量十进制地址
char_long_short.c
0x0012FF2C
char_long_short.l
0x0012FF30
char_long_short.s
0x0012FF34
可见,其内存分布图如下,共:
首先,1244972能被整除,所以放在处没有问题其实,就型成员变量自身来说,其放在任何地址单元处都没有问题,根据原则,在之后的中都没有能被因为整除的,能被整除,所以应该放在处,那么同理,最后一个是应该放在1244980处。
是不是这样就结束了?不是,还有原则。根据原则的要求,char_long_short这个结构体所占的空间大小应该是其占内存空间最大的成员变量的大小的整数倍。如果我们到此就结束了,那么所占的内存空间是4981共计,不符合原则,所以,必须在最后补齐个&。
至此,一个结构体的内存布局完成了。
下面我们按照上述原则,来验证这样的分析是不是正确。按上面的分析,地址单元、、以及、都是空的至少char_long_short未用到,只是&占位&了。如果我们的分析是正确的,那么,定义这样一个结构体,其所占内存也应该是:
struct&//声明结构体
& & &char&&c;
&&&&&char&&add1;&&//补齐空间
&&&&& & &char&&add2;&&//补齐空间
&&&&& & &char&&add3;&&//补齐空间
& & &long&&l;
& & &short&s;
& & & & &char&&add4;&&//补齐空间
& & & & &char&&add5;&&//补齐空间
}char_long_short_
运行结果如下:
可见,我们的分析是正确的。至于原则,大家可以自己编程验证,这里就不再讨论了。
&&&&所以,无论你是在还是,还是中,当你需要定义一个结构体时,只要你稍微留心结构体成员变量内存对齐这一现象,就可以在很大程度上节约的。这一点不仅仅应用于实际编程,在很多大型公司,比如、微软、百度、华为的笔试和面试中,也是常见的。
本例完整的程序代码下载: &
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved博客访问: 39635
博文数量: 18
博客积分: 580
博客等级: 中士
技术积分: 200
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
中文章如下:
最近看Computer Systems: A Programmer's Perspective,大致了解了c语言函数调用返回的堆栈变化. 比如函数返回int,实际上是把返回值存在一个特定的寄存器上(eax?),而返回一个float,是把返回值放在第一个浮点寄存器上%st(0) 请问,如果是返回结构体,那结构体放在哪里?我设想可以由callee把它放在堆中,在eax放置指向它的指针,然后由caller销毁.但是这样做很笨重.代码如下,该代码可以通过gcc的编译,即使我指定了 -std=c89:
#include <stdio.h>#include <stdlib.h>#include <memory.h>&&typedef struct St{& & int id;&&}St;&&St* returnPointer(void) &&{ & & St* p=calloc(1,sizeof(St));& & p->id=100;& & return p;&&} & & &&St returnStruct(void) &&{ & & St st;& & st.id=100;& & return st;&&} &&int main()&&{& & St st1=*(returnPointer()); & & St st2=returnStruct(); & & printf("%d\n", st1.id);& & printf("%d\n", st2.id);& & return 0;&&}
阅读(1359) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。【图文】C语言结构体基本知识_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
C语言结构体基本知识
上传于||暂无简介
大小:351.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢c语言结构体用法 - toxic - 博客园
结构(struct)
&&&& 结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。&
结构中可以使用不同的数据类型。&
&&& 1. 结构说明和结构变量定义&
&&& 在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此,& 象其它&
类型的变量一样, 在使用结构变量时要先对其定义。&
&&& 定义结构变量的一般格式为:&
&&&& struct 结构名&
&&&&&&&&& 类型& 变量名;&
&&&&&&&&& 类型& 变量名;&
&&&&&&&&& ...&
&&&& } 结构变量;&
&&& 结构名是结构的标识符不是变量名。&
&&& 类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和&
无值型)。&
&&& 构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中&
元素是以下标来访问的, 而结构是按变量名字来访问成员的。&
&&& 下面举一个例子来说明怎样定义结构变量。&
&&&& struct string&
&&&&&&&&& char name[8];&
&&&&&&&&&&
&&&&&&&&& char sex[2];&
&&&&&&&&& char depart[20];&
&&&&&&&&& float wage1, wage2, wage3, wage4, wage5;&
&&& 这个例子定义了一个结构名为string的结构变量person,&& 如果省略变量名&
person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义&
时上例变成:&
&&&& struct string&
&&&&&&&&& char name[8];&
&&&&&&&&&&
&&&&&&&&& char sex[2];&
&&&&&&&&& char depart[20];&
&&&&&&&&& float wage1, wage2, wage3, wage4, wage5;&
&&& 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作&
结构说明, 再用结构名来定义变量。&
&&& 例如:&
&&&& struct string Tianyr, Liuqi, ...;&
&&& 如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这&
种结构时前面的例子变成:&
&&&& struct&
&&&&&&&&& char name[8];&
&&&&&&&&&&
&&&&&&&&& char sex[2];&
&&&&&&&&& char depart[20];&
&&&&&&&&& float wage1, wage2, wage3, wage4, wage5;&
&&&& } Tianyr, L&
&&& 2. 结构变量的使用&
&&& 结构是一个新的数据类型, 因此结构变量也可以象其它类型的变量一样赋值、&
运算, 不同的是结构变量以成员作为基本变量。&
&&& 结构成员的表示方式为:&
&&&&&&&&& 结构变量.成员名&
&&& 如果将"结构变量.成员名"看成一个整体,& 则这个整体的数据类型与结构中&
该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。&
&&& 下面这个例子定义了一个结构变量, 其中每个成员都从键盘接收数据, 然后&
对结构中的浮点数求和, 并显示运算结果, 同时将数据以文本方式存入一个名为&
wage.dat的磁盘文件中。请注意这个例子中不同结构成员的访问。&
&&&& #i nclude &stdio.h&&
&&&& main()&
&&&&&&&&& struct{&&&&&&&&&&&&&&&&& /*定义一个结构变量*/&
&&&&&&&&&&&&&& char name[8];&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&& char sex[2];&
&&&&&&&&&&&&&& char depart[20];&
&&&&&&&&&&&&&& float wage1, wage2, wage3, wage4,&
&&&&&&&&& }a;&
&&&&&&&&& FILE *&
&&&&&&&&&&
&&&&&&&&& char c=&Y&;&
&&&&&&&&& fp="fopen"("wage.dat", "w");&&&&
/*创建一个文件只写*/&
&&&&&&&&& while(c==&Y&||c==&y&)&&&&&&&&&
/*判断是否继续循环*/&
&&&&&&&&& {&
&&&&&&&&&&&&&& printf("/nName:");&
&&&&&&&&&&&&&& scanf("%s", a.name);&&&& /*输入姓名*/&
&&&&&&&&&&&&&& printf("Age:");&
&&&&&&&&&&&&&& scanf("%d", &a.wage);&&& /*输入年龄*/&
&&&&&&&&&&&&&& printf("Sex:");&
&&&&&&&&&&&&&& scanf("%d", a.sex);&
&&&&&&&&&&&&&& printf("Dept:");&
&&&&&&&&&&&&&& scanf("%s", a.depart);&
&&&&&&&&&&&&&& printf("Wage1:");&
&&&&&&&&&&&&&& scanf("%f", &a.wage1);&& /*输入工资*/&
&&&&&&&&&&&&&& printf("Wage2:");&
&&&&&&&&&&&&&& scanf("%f", &a.wage2);&
&&&&&&&&&&&&&& printf("Wage3:");&
&&&&&&&&&&&&&& scanf("%f", &a.wage3);&
&&&&&&&&&&&&&& printf("Wage4:");&
&&&&&&&&&&&&&& scanf("%f", &a.wage4);&
&&&&&&&&&&&&&& printf("Wage5:");&
&&&&&&&&&&&&&& scanf("%f", &a.wage5);&
&&&&&&&&&&&&&&&
wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;&
&&&&&&&&&&&&&& printf("The sum of wage is&
%6.2f/n", wage);/*显示结果*/&
&&&&&&&&&&&&&& fprintf(fp,&
"%10s%4d%4s%30s%10.2f/n",& /*结果写入文件*/&
&&&&&&&&&&&&&&&&&&&&&&&&&&& a.name, a.age, a.sex,&
a.depart, wage);&
&&&&&&&&&&&&&& while(1)&
&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&& printf("Continue?&Y/N&");&
&&&&&&&&&&&&&&&&&&& c="getche"();&
&&&&&&&&&&&&&&&&&&&&
if(c==&Y&||c==&y&||c==&N&||c==&n&)&
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&& }&
&&&&&&&&& }&
&&&&&&&&& fclose(fp);&
&&& 3. 结构数组和结构指针&
&&& 结构是一种新的数据类型, 同样可以有结构数组和结构指针。&
&&& 一、结构数组&
&&& 结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学&
的姓名、性别、年龄和住址, 可以定义成一个结构数组。如下所示:&
&&&& struct{&
&&&&&&&&& char name[8];&
&&&&&&&&& char sex[2];&
&&&&&&&&&&
&&&&&&&&& char addr[40];&
&&&& }student[40];&
&&& 也可定义为:&
&&&& struct string{&
&&&&&&&&& char name[8];&
&&&&&&&&& char sex[2];&
&&&&&&&&&&
&&&&&&&&& char addr[40];&
&&&& struct string student[40];&
&&& 需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为:&
&&&&&&&&& 结构数组元素.成员名&
&&& 例如:&
&&&&& student[0].name&
&&&&& student[30].age&
&&& 实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是&
一个结构变量, 第二维是结构成员。&
&&& 注意:&
&&& 结构数组的成员也可以是数组变量。&
&&& 例如:&
&&&& struct a&
&&&&&&&&& int m[3][5];&
&&&&&&&&&&
&&&&&&&&& char s[20];&
&&&& }y[4];&
&&& 为了访问结构a中结构变量y[2]的这个变量, 可写成&
&&&&&& y[2].m[1][4]&
&&& 二、结构指针&
&&& 结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定&
义, 例如用前面已说明的结构定义一个结构指针如下:&
&&&& struct string{&
&&&&&&&&& char name[8];&
&&&&&&&&& char sex[2];&
&&&&&&&&&&
&&&&&&&&& char addr[40];&
&&& 也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。&
&&&&& struct string *&
&&& 使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式&
上有所不同。结构指针对结构成员的访问表示为:&
&&&&&& 结构指针名-&结构成员&
&&& 其中"-&"是两个符号"-"和"&"的组合, 好象一个箭头指向结构成员。例如要&
给上面定义的结构中name和age赋值, 可以用下面语句:&
&&&& strcpy(student-&name, "Lu G.C");&
&&&& student-&age=18;&
&&& 实际上, student-&name就是(*student).name的缩写形式。&
&&& 需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地&
址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间,&
这可用下面函数完成, 仍以上例来说明如下:&
&&&& student=(struct string*)malloc(size of&
(struct string));&
&&& size of (struct string)自动求取string结构的字节长度,&
malloc() 函数&
定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。&
&&& 注意:&
&&& 1. 结构作为一种数据类型,& 因此定义的结构变量或结构指针变量同样有局&
部变量和全程变量, 视定义的位置而定。&
&&& 2. 结构变量名不是指向该结构的地址, 这与数组名的含义不同,& 因此若需&
要求结构中第一个成员的首地址应该是&[结构变量名]。&
&&& 4. 结构的复杂形式&
&&& 一、嵌套结构&
&&& 嵌套结构是指在一个结构成员中可以包括其它一个结构, Turbo C 允许这种&
&&& 例如: 下面是一个有嵌套的结构&
&&&& struct string{&
&&&&&&&&& char name[8];&
&&&&&&&&&&
&&&&&&&&&&
&&& 其中: addr为另一个结构的结构名, 必须要先进行, 说明, 即&
&&&& struct addr{&
&&&&&&&&& char city[20];&
&&&&&&&&& &
&&&&&&&&& char tel[14];&
&&& 如果要给student结构中成员address结构中的zipcode赋值, 则可写成:&
&&&&& student.address.zipcode=200001;&
&&& 每个结构成员名从最外层直到最内层逐个被列出, 即嵌套式结构成员的表达&
&&&&& 结构变量名.嵌套结构变量名.结构成员名&
&&& 其中: 嵌套结构可以有很多, 结构成员名为最内层结构中不是结构的成员名。&
&&& 二、位结构&
&&& 位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构&
比按位运算符更加方便。&
&&& 位结构定义的一般形式为:&
&&&& struct位结构名{&
&&&&&&&&& 数据类型 变量名: 整型常数;&
&&&&&&&&& 数据类型 变量名: 整型常数;&
&&&& } 位结构变量;&
&&& 其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整&
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。&
&&& 变量名是选择项, 可以不命名, 这样规定是为了排列需要。&
&&& 例如: 下面定义了一个位结构。&
&&&& struct{&
&&&&&&&&& unsigned incon: 8;&&
/*incon占用低字节的0~7共8位*/&
&&&&&&&&& unsigned txcolor:&
4;/*txcolor占用高字节的0~3位共4位*/&
&&&&&&&&& unsigned bgcolor:&
3;/*bgcolor占用高字节的4~6位共3位*/&
&&&&&&&&& unsigned blink: 1;& /*blink占用高字节的第7位*/&
&&& 位结构成员的访问与结构成员的访问相同。&
&&& 例如: 访问上例位结构中的bgcolor成员可写成:&
&&&&& ch.bgcolor&
&&& 注意:&
&&& 1. 位结构中的成员可以定义为unsigned, 也可定义为signed,& 但当成员长&
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。&
&&& 2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,&
如果是指针, 其成员访问方式同结构指针。&
&&& 3. 位结构总长度(位数), 是各个位成员定义的位数之和,& 可以超过两个字&
&&& 4. 位结构成员可以与其它结构成员一起使用。&
&&& 例如:&
&&&& struct info{&
&&&&&&&&& char name[8];&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&& unsigned state: 1;&
&&&&&&&&& unsigned pay: 1;&
&&&&&&&&& }&&
&&& 上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结&
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工&
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。&

我要回帖

更多关于 c语言结构体数组 的文章

 

随机推荐