C语言-结构体详解

结构体详解


结构体是什么?
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
看了这个概念你有没有联想到其他,跟数组定义很类似,数组的是 相同类型元素的集合。
语法

1.结构体的声明

C语言的内置类型(int ,char , float…)无法描述一个复杂的变量,比如我需要描述一个人,需要姓名,年龄,性别这些信息,所以我们需要创建一个结构体类型来描述一个学生。

struct student
{
	char name[20];
	int age;
	char sex[5];
}

关键词是struct, 括号里面是结构体的成员列表。在这要注意一点,结构体声明的时候不能初始化。

匿名结构体

这是一种特殊的结构体声明,如图所示

struct
{
	char name[20];
	int age;
	char sex[5];
}s1={0};

需要注意的是匿名结构体声明只能用一次,看下面的代码。

 struct 
 {
 	int a;
 	char c;
 	float f;
 }x;
 struct 
 {
 	int a;
 	char c;
 	float f;
 }*p;

请问能不能写成

p=&x;

答案是不行,因为编译器会认为p和 x是两个完全不同的类型。

结构体的自引用

结构体里面能不能包含自己本身呢?当然可以,不过需要注意的是,得写成指针得形式

struct s
{
	int a;
	char c;
	struct s z;
}//error
struct s
{
	int a;
	char c;
	struct s* ps;
}

如果写成第一种的形式,用sizeof(struct s)计算这个结构体的大小就可以看出这是完全不行的。

2.结构体的定义和初始化

struct student
{
	char name[20];
	int age;
	char sex[5];
}s1={"zhangsan",21,"male"};
int main()
{
	struct student s2={.age=21,.name="lisi",.sex="male"};
	return 0;
}

s1和s2都是定义的结构体变量,这两个的区别就是s1是全局变量,s2是局部变量。
. 操作符可以访问结构的成员变量,如果不按顺序初始化可以用.操作符

3.结构体的大小

这里涉及到内存对齐,先来看一下内存对齐的规则

1.结构体的第一个成员永远相较与结构体起始变量位置的偏移量为0的位置
2.从第二个成员开始,往后的每个成员都要对齐到某个对齐数的整数倍处
对齐数:结构体成员自身的大小和默认对齐数的较小值
3.结构体的总大小,必须是最大对齐数的整数倍(最大对齐数是所有成员的对齐数中最大的值)

这里简单举个例子

#include <stdio.h>
struct s
{
	int a;//对齐数是4;
	char b;//对齐数是1
	int c;//对齐数是4
}int main()
{
	printf("%d\n", sizeof(struct s));
	return 0;
}

问结构体的大小是多少,看图
image.png

很简单,对照着规则应该很容易看懂
可以验证一下
image.png

4.结构体传参

这里简单说一下两者的区别

struct s
{
	int a;
	char b;
	int c;
};
int main()
{
	struct s s1={12, 'c', 41};
	print(s1);//传参
	print(&s1);传址
	return 0;
}

image.png
用人话讲大概就是传址更节省空间,毕竟一个地址只有4/8个字节,而如果传参就是要重新开辟一个结构体大小的空间。

  • 35
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
引用\[1\]:C语言字节对齐问题详解中提到了C语言中的字节对齐问题。在结构体中,为了提高内存访问的效率,编译器会对结构体进行字节对齐。这意味着结构体的成员在内存中并不是紧凑排列的,而是按照一定的规则进行对齐。具体的对齐规则取决于编译器和编译选项。\[1\] 引用\[2\]:在C语言中,可以使用宏offsetof来获取结构体成员相对于结构体开头的字节偏移量。这个宏非常有用,可以帮助我们计算出每个结构体成员相对于结构体开头的偏移字节数。通过这个宏,我们可以更好地理解结构体的内存布局。\[2\] 引用\[3\]:在C语言中,指针和结构体的组合常常用于处理复杂的数据结构。指针可以指向结构体的成员,通过指针可以方便地对结构体进行操作。指针和结构体的组合可以实现更灵活的数据处理和内存管理。\[3\] 综上所述,C语言中的指针结构体组合可以用于处理复杂的数据结构,而字节对齐问题则是在结构体中为了提高内存访问效率而进行的优化。通过使用宏offsetof,我们可以更好地理解结构体的内存布局。 #### 引用[.reference_title] - *1* *3* [结构体指针,C语言结构体指针详解](https://blog.csdn.net/weixin_34069265/article/details/117110735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言结构体详解](https://blog.csdn.net/m0_70749276/article/details/127061692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不居一格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值