2.2 结构体变量的使用
结构体变量队成员调用的方式:
结构体变量.结构体成员
#include <stdio.h>
struct stu{
int age;
int id;
char name[32];
char sex;
}zhangsan;
int main()
{
zhangsan.age=18;
zhangsan.id=20;
strcpy(zhangsan.name,"张三");
zhangsan.sex="M";
printf("%d %d %s %c\n",zhangsan.age,zhangsan.id,zhangsan.name,zhangsan.sex);
return 0;
}
结构体嵌套结构体:
#include <stdio.h>
typedef struct{
int year;
int month;
int day;
}BIR;
typedef struct {
int age;
char name[32];
BIR birthday;
}STU;
int main()
{
STU stu;
stu.age=18;
strcpy(stu.name,"张三");
stu.birthday.year=2024;
stu.birthday.month=7;
stu.birthday.day=30;
printf("%d %s %d:%d:%d\n",stu.age,stu.name,stu.birthday.year,stu.birthday.month,stu.birthday.day);
return 0;
}
三、结构体数组
结构体数组是个数组,由若干个相同类型的结构体变量构成的集合
2.1 结构体数组的定义方法
struct 结构体类型名 数组名[元素个数],
2.2 结构体数组元素的引用
结构体数组元素的引用 数组名[下标]
2.3 数组元素的使用
edu[0].mum =101;//用 101 给 edu 数组的第0个结构体变量的 num 赋值strcpy(edu[1].name,"lucy");
四、结构体指针
即结构体的地址,结构体变量存放内存中,也有起始地址咱们定义一个变量来存放这个地址,那这个变量就是结构体指针变量。
1、结构体指针变量的定义方法
struct 结构体类型名 *结构体指针变量名;
2、结构体指针变量对成员的引用
1.(*结构体指针变量名).成员
2.结构体指针变量名->成员
#include <stdio.h>
#include<string.h>
struct stu{
int age;
char name[32];
int id;
};
int main()
{
struct stu *s;
s=(struct stu *)malloc(sizeof(struct stu));
s->id=1001;
strcpy(s->name,"张三");
s->age=18;
printf("%d,%s,%d\n",s->id,s->name,s->age);
return 0;
}
五、结构体内存分配问题
规则1:以多少个字节为单位开辟内存
给结构体变量分配内存的时候,会去结构体变量中找基本类型的成员哪个基本类型的成员占字节数多,就以它大大小为单位开辟内存,在gcc中出现了double类型的例外
(1):成员中只有char型数据,以1字节为单位开辟内存。
(2):成员中出现了short 类型数据,没有更大字节数的基本类型数据。以2字节为单位开辟内存
(3):出现了int、foat 没有更大字节的基本类型数据的时候以4字节为单位开辟内存。
(4):出现了double类型的数据
情况1:
在vc里,以8字节为单位开辟内存。
情况2:
在gcc里,以4字节为单位开辟内存。
无论是那种环境,double型变量,占8字节
注意:
如果在结构体中出现了数组,数组可以看成多个变量的集合。
如果出现指针的话,没有占字节数更大的类型的,以4字节为单位开辟内存。
规则2:字节对齐
(1):char 1字节对齐, 即存放char型的发量,内存单元的编号是1的倍数即可。
(2): short 2字节对齐, 即存放 short int 型的变量,起始内存单元的编号是2的倍数即可。
(3): int 4字节对齐 , 即存放 int 型的变量,起始内存单元的编号是4的倍数即可
(4): long 在 32 位平台下,4 字节对齐 ,即存放 1ong int 型的变量,起始内存单元的编号是4的倍数即可
(5):float 4字节对齐, 即存放float型的变量,起始内存单元的编号是4的倍数即可
(6): double
a.yc 环境下
8 字节对齐,即存放 double 型变量的起始地址,必须是8的倍数, double 变量占8字节
b.gcc 环境下
4 字节对齐,即存放 double 型变量的起始地址,必须是4的倍数, double 变量占8字节。
注意 3:当结构体成员中出现数组的时候,可以看成多个变量。
注意 4:开辟内存的时候,从上向下依次按成员在结构体中的位置顺序开辟空间
六、位段
在结构体中,以位为单位的成员,咱们称之为位段(位域)。
struct packed_data
{
unsigned int a:2;
unsigned int b:6;
unsigned int c:4;
unsigned int d:4;
unsigned int i;
} data;
位段注意:
1、对于位段成员的引用如下:
data.a =2
赋值时,不要超出位段定义的范围;
如段成员a定义为2位,最大值为3,即(11)2
所以data.a=5,就会取5的低两位进行赋值 101
2、位段成员的类型必须指定为整形或字符型
3、一个位段必须存放在一个存储单元中,不能跨两个单元第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段
4、位段的长度不能大于存储单元的长度
(1):char型位段不能大于8位
(2):shortint型位段不能大于 16 位
(3):int的位段,位段不能大于 32 位
(4):1ong int的位段,位段不能大于32位
七、公用体
1:共用体和结构体类似,也是一种构造类型的数据结构。
既然是构造类型的,咱们得先定义出类型,然后用类型定义变量。
定义共用体类型的方法和结构体非常相似,把struct 改成 union 就可以了。
在进行某些算法的时候,需要使几种不同类型的变量存到同一段内存单元中,几个变量所使用空间相互重叠
这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构
共用体所有成员占有同一段地址空间共用体的大小是其占内存长度最大的成员的大小
共用体的特点:
1、同一内存段可以朋来存放几种不同类型的成员,但每一瞬时只有一种起作用
2、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖
3、共用体变量的地址和它的各成员的地址都是同一地址
4、共用体变量的初始化union data a={123}:初始化共用体为第一个成员
八、枚举
将变量的值--列举出来,变量的值只限于列举出来的值的范围内
枚举类型也是个构造类型的既然是构造类型的数据类型,就得先定义类型,再定义变量
1、枚举类型的定义方法
emum 枚举类型名{
枚举值列表;
}
在枚举值表中应列出所有可用值,也称为枚举元素
枚举变量仅能取枚举值所列元素
2、枚举变量的定义方法
emum 枚举类型名 枚举变量名;
① 枚举值是常量,不能在程序中用赋值语句再对它赋值例如:sun=5; mon=2;sun=mon;都是错误的
②枚举元素本身由系统定义了一个表示序号的数值默认是从0开始顺序定义为0,1,2…如在week中,mon值为0,tue值为1,…,sun值为6
③ 可以改变枚举值的默认值:如emum week //枚举类型
{mon=3,tue, wed,thu, fri=4,sat.sun};
mon=3 tue=4,以此类推fri=4 以此类推
#include <stdio.h>
#include<string.h>
enum week
{
mon,tue,wed,thu,fri,sat,sun
};
int main()
{
enum week day=mon;
printf("day=%d\n",day);
day=sun;
printf("day=%d\n",day);
return 0;
}