结构体 共用体
结构体
是一种构造类型,把多个个体构造成一个整体,来描述复合数据,一般在源文件开始部分定义,这样以下全部函数都可以用他定义,也可以在函数中定义,不过仅限该函数使用
定义与调用
#include<stdio.h>
/*定义
struct{
类型 成员名;
......
类型 成员名;
};*/
struct student{
long num;//学号
char name[11];//名字,最多不超过5个汉字
int age;//年龄
};
int main(){
//在函数中定义结构体类型
struct student xiaoming;
//调用结构体类型,用.来调用
xiaoming.num
}
注:struct{}后要有分号
也可以用->来调用,与.不同的是, ->是用来访问结构体指针所指向的结构体数据成员。
这两者运算符是运算级最高的运算符
#include<stdio.h>
struct student{
long num;
char name[11];
int age;
};
int main(){
struct student w1={20101010,"王红",23},*p;
p=&w1;
printf("%d,%s,%d\n",p->num,p->name,p->age);
}
函数返回结构体指针
struct 结构体名 *函数名(形参表)
位域
有的信息在存储时不用占一整个字节或长整数,只用几个二进制位
位域是一个特殊的结构体类型,声明是,变量不是基本数据类型,而是以二进制为单位的若干二进制位
struct file_date{
unsigned int day:5;//day成员是5位二进制整数
unsigned int month:4;//month成员是4位二进制整数
unsigned int year:7;//year成员是7位二进制整数
};
注:
-
位域成员类型只有int,unsigned int,signed int。大多数不用int
-
位域没有地址,取地址运算符&不能用于位域
-
位域存储在整型单元中,整型存储单元通常为8位,16位,32位。位域从二进制低位开始,依次存放,例如,上述代码中day使用0-4位,month使用5-8位,year使用9-15位,若存储单元剩余的空间不足以存放一个位域,则会跳到下一个存储单元重新从低位存放数据
-
可以指定从另一个存储单元存放位域
struct m( unsigned int a:4; unsigned int :0;//无名字段 unsigned int b:5; );由于有0长度的位域,那么从0的下一个成员开始,位域存储在下一个存储单元的起始位置中
-
可以声明无位域成员
例如上述无名字段,该字段不可使用
共用体
又称联合体,与结构体类似
定义
union 共用体名{
类型 成员名1;
...
类型 成员名n;
}
与结构体不同的是:它的所有成员占一块内存区域,整个区域的大小由使用最大内存的成员来决定
对其中某个成员变量赋值时,有可能改变其他成员的值
c语言中不能引用整个共用体,只能引用其中的各个成员
共用体变量中有意义的成员是最后一次赋值的成员,一个成员赋值后,其他成员就失去了意义。
初始化时,通常只对第一个成员赋值
#include<stdio.h>
union num{
int x;
float y;
};
int main(){
union num date;
date.x=100;
printf("%d,%f\n",date.x,date.y);
date.y=100.0;
printf("%d,%f\n",date.x,date.y);
}
/*100,0.000000
1120403456,100.000000 对y赋值后,x就失去了意义
*/

浙公网安备 33010602011771号