自定义类型:结构体

本文详细介绍了C语言中结构体的使用,包括结构体的声明、创建与初始化,以及结构体变量的访问方式。重点讨论了结构体内存对齐的规则和原理,通过实例演示了如何影响结构体大小。
摘要由CSDN通过智能技术生成

1.结构体类型

我们学过很多类型,如int,char,float,char,double等等,它们只能定义单一变量,但是如果描述一个复杂事物,比如书,人等,就要使用结构体了。

结构体(struct)是一种用户自定义的可用的数据类型,允许存储不同类型的数据项。结构(体)是一些值的集合,这些值称为变量名


2.结构体变量的声明

struct tag//结构体名称
{
 member-list;//结构体变量
}variable-list;//变量列表

注意:结构体有{},同时不要忘记{}后面的


3.结构体的创建和初始化 

3.1结构体的创建 

结构体的声明了解后,就可以创建结构体了。

比如,描述一个学生

struct Stu
{
	char name[20];
	int age;
	char sex[6];
	char ID[15];
};//分号一定不能忘

3.2结构体的初始化

如果想进一步看此学生的各种信息,就要初始化结构体

代码如下:

#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	char sex[6];
	char ID[15];
};//分号一定不能忘
int main()
{
	struct Stu s = { "张三",18,"male","23893729" };
	return 0;
}

再进一步,可以嵌套定义和初始化

比如

#include<stdio.h>
struct St
{
	int a;
	double b;
	char c;
};
struct Tu
{
	struct St s;//嵌套定义
	char name[20];
	char ID[20];
};
int main()
{
	struct Tu t = { {20,8.00,'d'},"zhangsan","374892145" };
	return 0;
}

4.结构体成员的访问

有两种访问形式,接下来,我就分别开始介绍。

4.1变量名 . 结构体成员名

拿上面学生的例子来展示

#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	char sex[6];
	char ID[15];
};//分号一定不能忘
int main()
{
	struct Stu s = { "张三",18,"male","23893729" };
	printf("%s %d %s %s\n", s.name, s.age, s.sex, s.ID);//访问
	return 0;
}

 4.2结构体指针 -> 成员名

还是拿学生的例子举例

#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	char sex[6];
	char ID[15];
};//分号一定不能忘
int main()
{
	struct Stu s = { "张三",18,"male","23893729" };
	struct Stu* ptr = &s;
	printf("%s %d %s %s\n", ptr->name, ptr->age, ptr->sex, ptr->ID);//访问
	return 0;
}

OK,上面的告一段落,下面是重头戏


5.结构体内存对齐

对齐规则

1.结构体的第一个变量对齐到结构体变量起始位置偏移量为0的地址。

 2.其他成员变量要对齐到某个数字(对齐数)的整数倍地址处。

   对齐数:编译器默认的数与该成员变量的较小值

   VS编译器的默认数是8

 3.结构体总大小为最大对齐数的整数倍。

 4.如果遇到嵌套结构体情况,结构体1嵌套在结构体2中,还是按照上述结果去算即可,把结构体1当做一个变量就可以。

上面的概念比较难懂,那我就画图来解释一下 

struct S
{
    int a;
    char b;
	double c;
};
int main()
{
	printf("%d\n", sizeof(struct S));
	return 0;
}

运行截图 ,大小为16

如果把结构体中的变量换位置,那么结构体的大小就可能不同。 

举一个嵌套定义的例子

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

struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
int main()
{
	printf("%d\n", sizeof(struct S4));
	return 0;
}

 

运行结果 

over~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值