结构体 共用体

结构体

是一种构造类型,把多个个体构造成一个整体,来描述复合数据,一般在源文件开始部分定义,这样以下全部函数都可以用他定义,也可以在函数中定义,不过仅限该函数使用

定义与调用

#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位二进制整数
};

注:

  1. 位域成员类型只有int,unsigned int,signed int。大多数不用int

  2. 位域没有地址,取地址运算符&不能用于位域

  3. 位域存储在整型单元中,整型存储单元通常为8位,16位,32位。位域从二进制低位开始,依次存放,例如,上述代码中day使用0-4位,month使用5-8位,year使用9-15位,若存储单元剩余的空间不足以存放一个位域,则会跳到下一个存储单元重新从低位存放数据

  4. 可以指定从另一个存储单元存放位域

    struct m(
    	unsigned int a:4;
        unsigned int  :0;//无名字段
        unsigned int b:5;
    );
    

    由于有0长度的位域,那么从0的下一个成员开始,位域存储在下一个存储单元的起始位置中

  5. 可以声明无位域成员

​ 例如上述无名字段,该字段不可使用

共用体

又称联合体,与结构体类似

定义

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就失去了意义
*/
posted @ 2021-12-12 14:36  valder-  阅读(82)  评论(0)    收藏  举报