结构体,联合体,枚举

发布时间 2023-07-22 20:49:54作者: 若达萨罗

结构体

  1. 结构体是不同类型的值的集合,用struct关键字声明,我们可以用这个定义好的结构体创建多个学生对象,并且可以初始化他们各自的成员信息。最后我们通过.操作符访问成员的相应属性。
#include <stdio.h>

// 定义一个学生类型的结构体
struct Stu
{	
	// 学生姓名
	char name[20];
	// 学生年龄
	int age;
	// 学生性别
	char gender[6];
};

int main(void)
{
	// 学生s1
	struct Stu s1 = {"张三", 18, "男"};
	// 学生s2
	struct Stu s2 = {"李四", 20, "女"};
	// 学生s3
	struct Stu s3 = {"王五", 22, "保密"};

	//打印学生信息
	printf("第一个学生的信息: %s %d %s\n第二个学生的信息: %s %d %s\n第三个学生的信息: %s %d %s\n", s1.name, s1.age, s1.gender,s2.name, s2.age, s2.gender,s3.name, s3.age, s3.gender);

	return 0;
}

image

注意:我们可以用typedef关键字对结构体变量进行重命。
2. 上面我们定义了一个结构体变量,当然我们也可以定义一个结构体指针,区别是结构体指针访问成员的属性的方式不同,用的是->操作符。

#include <stdio.h>

// 定义一个学生类型的结构体
struct Stu
{
	// 学生姓名
	char name[10];
	// 学生年龄
	int age;
	// 学生性别
	char gender[6];

int main(void)
{
	struct Stu* s;
	s = (struct Stu*)malloc(sizeof(struct Stu));
	strcpy(s->name,"小明");
	s->age = 22;
	strcpy(s->gender,"男");
	return 0;
}

  1. 结构体内还可以嵌套结构体
#include <stdio.h>

// 定义一个学生类型的结构体
struct Stu
{
	// 学生姓名
	char name[10];
	// 学生年龄
	int age;
	// 学生性别
	char gender[6];


// 定义一个人的类型的结构体
struct Person
{
	// 家庭地址
	char addr[20];
	// 联系电话
	char tele[12];
	struct Stu s1;	
};

int main(void)
{
	struct Person p = {"四川省成都市","13988775544",{"小慧", 23, "女"}};
	printf("家庭地址:%s 电话:%s 姓名:%s 年龄:%d 性别:%s\n", p.addr, p.tele, p.s1.name,p.s1.age,p.s1.gender);

	return 0;
}

  1. 关于计算结构体的大小(结构体的内存对齐)
#include <stdio.h>


struct S
{
	char c;
	double d;
	int i;
};

int main(void)
{

	printf("%ld\n", sizeof(struct S));

	return 0;
}

image
首先字符c就在开始位置占一个字节,然后看double d我当前操作系统的默认对齐数是8,double也是八个字节,所以对齐数是8,它必须是地址的整数倍,所以double从偏移量为8的位置开始占位8个字节,int i4个字节,与默认对齐数8比较较小值是4,所以i从偏移量为16处开始占位四个字节。到现在已经占有20个字节了,还有最后一条规则就是结构体的总大小是每个成员中的最大对齐数那个数的整数倍,当前结构体中的最大对齐数就是8,20不是8的整数倍,所以还要往后占用四个字节大小空间直到总大小为24个字节才是8的整数倍。
image
image

联合体

声明联合体的关键字是union,联合体里面的成员共用一块内存空间,且在同一时间这块内存空间只能被一个成员使用。
在联合体中,可以应用在判断当前操作系统是大端存储还是小端存储。利用的原理就是所有成员共用一块内存空间。

#include <stdio.h>


union U
{
	char c;
	int i;
}u;

int main(void)
{
	u.i = 1;
	if(1 == u.c)
		printf("小端\n");
	else
		printf("大端\n");	

	return 0;
}

image

枚举

那些可以列举且有限的常量可以用枚举的形式存储起来使用,关键字enum

#include <stdio.h>

// 三原色
enum Color
{
	RED,
	GREEN,
	BLUE
};

int main(void)
{
	printf("%d\n", RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);
	
	return 0;
}