C语言结构体相关知识详解

结构体类型的介绍及创建

结构体类型的介绍

在C语言中,经常需要描述一个复杂对象,例如学生,书籍,这类对象一般包含多个信息,例如学生包含学号、名字,所属学院等等,书籍则包括版本号、书名、出版社等等,这些不能单独用int、char、float等类型定义的,我们就用结构体来描述,例如:

struct student
{
	char name[10];//学生名字
	char studynum[20];//学号
};

结构体类型的创建和初始化

了解了结构体类型的作用,我们再来了解如何创建并初始化一个结构体

结构体的创建

首先我们需要了解结构体创建的关键字:struct
结构体的基本结构如下:

struct 名字
{
	//结构体成员定义在大括号中
};//这里有一个分号不能忘记

这里我们需要注意,结构体的类型是struct 名字这个整体,例如上面的struct student
我们也可以使用typedef来重命名结构体

typedef struct student
{
	char name[10];
	char num[20];
	char sex;
}stu;//使用typedef将struct student类型重命名为stu类型

结构体还能匿名创建:

struct
{
	char name[20];
	char sex;
	char num[20];
}x;//使用这个匿名结构体创建x这个变量

struct
{
	char name[20];
	char sex;
	char num[20];
}s1,*p;//使用这个匿名结构体创建了s1,p这两个变量

注意,匿名结构体在不重命名的情况下只能使用一次,变量只能在创建匿名结构体时同时创建变量
同时需要注意,对于上述代码,p = &x; 这条语句是错误的,因为两个变量类型是不相同的,编译器会报错

结构体的初始化

首先我们需要了解两个结构体成员访问操作符 .->,这两个操作符用来访问结构体当中的成员变量,其中->用于指针访问结构体成员,我们结合初始化的例子一起理解:

#include <stdio.h>
struct student
{
	char name[20];//名字
	int age;
	char num[20];//学号
	char sex[5];//性别
};
int main()
{
	struct student stu1 = { "zhangsan",19,"2204020304",'男' };//这里在创建时直接初始化
	struct student stu2 = { .age = 20,.name = "lisi",.num = "2204030405",.sex = "女"};//使用.操作符改变初始化顺序

	printf("%d\n", stu1.age);//使用 . 操作符访问stu1中的变量age
	printf("%s\n", (&stu1)->name);//使用 -> 操作符访问stu1中的变量name,因为->只能操作指针,所以需要先取出stu1的地址再使用
	printf("%d\n", stu2.age);//使用 . 操作符访问stu2中的变量age
	printf("%s\n", (&stu2)->sex);//使用 -> 操作符访问stu2中的变量sex

	return 0;
}

打印结果如下:
在这里插入图片描述

结构体的内存对齐

当我们想求一个结构体所占空间的大小时,首先需要明白,结构体的大小并不简单是其所有成员变量所占空间大小之和,这其中还涉及结构体的内存对齐的规则,例如:

struct s
{
	char b;//1byte
	int age;//4byte
	float num;//4byte
	int x;//4byte
};

对于上面这个结构体,其所占空间大小并不是1+4+4+4=16个字节,而是需要根据内存对齐的规则计算
内存对齐的规则:
1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处
对⻬数 编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值
VS 中默认的值为 8
Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
3结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的
整数倍
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构
体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍
下面根据例题实际计算:

//练习1 
struct S1
{
 char c1;
 int i;
 char c2;
};
printf("%d\n", sizeof(struct S1));

在这里插入图片描述

//练习2
struct S2
{
 double d;
 char c;
 int i;
};
printf("%d\n", sizeof(struct S2));

在这里插入图片描述

//练习3-结构体嵌套问题 
struct S3
{
 char c1;
 struct S2 s2;
 double d;
};
printf("%d\n", sizeof(struct S3));

在这里插入图片描述

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值