【C结构体】初识结构体

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:C语言初阶
⭐代码仓库:C Advanced
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!


前言

结构体在C语言当中是很重要的,这对于后续需要写教务系统和登记成员的情况是很重要的,这篇讲的是初识结构体,带领大家学习结构体入门,并逐渐掌握结构体。结构体的知识点主要包括结构体类型的声明,结构体的初始化,结构体成员访问和结构体传参。


一、结构体类型的声明

(一)结构体的基础知识

概念:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

在我们这个世界中,有很多的复杂对象,像描述一个学生,描述一本书,那么C语言编译器是怎么将这些复杂对象包含在一起的呢?如下图,接下来我们将引进struct关键字对其进行分装。
在这里插入图片描述

(二)结构体的声明与定义

1.定义结构体的类型

概念:结构体的成员可以是标量、数组、指针,甚至是其他结构体(结构体的嵌套)。

如下图,结构体内部是由标签名,成员列表和变量列表组成的。
在这里插入图片描述
我们试着创建一个结构体,如下图,根据右边需要输入学生信息来创建的结构体。
在这里插入图片描述

2.结构体变量的定义

(1)直接创建

当我们定义了结构体的类型,有了类型根据main函数里进行创建结构的变量,这其实相当于类型是int, float的类型,而结构体变量就是在main函数里进行创建的变量,相当于我们熟悉的int a; float b等。
在这里插入图片描述

(2)利用变量列表创建

记得前面讲的定义结构体的类型里的变量列表吗,它也是可以创建结构体变量的,只不过如果在main函数内部创建,这个结构体变量是一个局部变量,而在变量列表中创建结构体变量则为全局变量。
在这里插入图片描述

3.结构体变量的初始化

如下图:定义完结构体变量后进行初始化,这与数组类似,在一个大括号里包含结构体的类型内要输入的数据。
在这里插入图片描述

代码如下:

#include<stdio.h>

struct Stu {
	//结构体成员
	char name[20];
	int age;
	char sex[10];
	float score;
} /*s4, s5*/; //也是结构体变量 - 全局

//struct Stu s6; //也是结构体变量 - 全局

int main() {
	//struct Stu s1, s2, s3;  //结构体变量 - 局部
	
	//定义并初始化结构体变量
	struct Stu s7 = { "zhangsan",20,"nan",80.0f };
	struct Stu s8 = { "lisi",19,"nan",99.0f };
	struct Stu s9 = { "ruhua",18,"nv",98.0f };
	
	//打印
	printf("%s %d %s %.1f\n", s7.name, s7.age, s7.sex, s7.score);
	printf("%s %d %s %.1f\n", s8.name, s8.age, s8.sex, s8.score);
	printf("%s %d %s %.1f\n", s9.name, s9.age, s9.sex, s9.score);
	return 0;
}

(三)结构体嵌套

如下代码:

#include<stdio.h>

struct P {
	double d;
	float f;
};

struct S {
	int a;
	struct P p;  //嵌套一个结构体类型P
	char c;
};

int main() {
	//定义结构体变量并初始化
	struct S s = { 10,{3.14,3.2f},'c'};
	
	//打印
	printf("%d %.2lf %.1f %c", s.a, s.p.d, s.p.f, s.c);
	return 0;
}

在这里插入图片描述


二、结构体成员的访问

进行结构体成员的访问,主要是两种操作符,一种是(.),另一种是(->)(链表内容),这两种操作符分别对应的是找值并进行改变和找地址并进行改变,是两种不同的访问操作符,我将在接下来的传参中细细讲解。


三、结构体传参

1.传值打印

进行传值,将结构体变量里的值进行传参到函数里,并进行打印。特别要注意的是,仅仅是结构体变量的话为结构体变量.成员。

struct P {
	double d;
	float f;
};

struct S {
	int a;
	struct P p;  //嵌套一个结构体类型P
	char c;
};

void Print1(struct S sp) {
	//结构体变量.成员
	printf("%d %.2lf %.1f %c", sp.a, sp.p.d, sp.p.f, sp.c);
}
int main() {
	//定义结构体变量并初始化
	struct S s = { 10,{3.14,3.2f},'c'};
	
	//打印
	//printf("%d %.2lf %.1f %c", s.a, s.p.d, s.p.f, s.c);
	Print1(s);
	
	
	return 0;
}

在这里插入图片描述

2.传址打印

进行传址,将结构体变量的地址传参到函数里并进行打印。特别要注意的是,如果是结构体指针的话,只需要结构体指针->成员即可。

#include<stdio.h>

struct P {
	double d;
	float f;
};

struct S {
	int a;
	struct P p;  //嵌套一个结构体类型P
	char c;
};

//传值调用
//void Print1(struct S sp) {
	//printf("%d %.2lf %.1f %c\n", sp.a, sp.p.d, sp.p.f, sp.c);
//}
// 
//传址调用
void Print2(struct S* sp1) {
	printf("%d %.2lf %.1f %c\n", (*sp1).a, (*sp1).p.d, (*sp1).p.f, (*sp1).c);
	//结构体指针—>成员
	printf("%d %.2lf %.1f %c\n", sp1->a, sp1->p.d, sp1->p.f, sp1->c);   //结构体指针

}

int main() {
	//定义结构体变量并初始化
	struct S s = { 10,{3.14,3.2f},'c'};
	
	//打印
	//printf("%d %.2lf %.1f %c\n", s.a, s.p.d, s.p.f, s.c);
	//Print1(s); //传值调用
	Print2(&s); //传址调用

	return 0;
}

在这里插入图片描述

3.哪者更优

ps:上面的Print1和Print2函数哪个更好?
答:首选Print2,在进行结构体传参的时候,首选结构体地址的传参。
因为函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以导致性能的下降。

如果大家对压栈不是很了解,我放一篇我自己写的博客供大家先去理解一下。
函数栈帧创建与销毁

四、scanf输入结构体变量值

struct P {
	double d;
	float f;
};

struct S {
	int a;
	struct P p;  //嵌套一个结构体类型P
	char c;
};

//传值调用
//void Print1(struct S sp) {
	//printf("%d %.2lf %.1f %c\n", sp.a, sp.p.d, sp.p.f, sp.c);
//}
// 
//传址调用
//void Print2(struct S* sp1) {
	//printf("%d %.2lf %.1f %c\n", (*sp1).a, (*sp1).p.d, (*sp1).p.f, (*sp1).c);
	//printf("%d %.2lf %.1f %c\n", sp1->a, sp1->p.d, sp1->p.f, sp1->c);   //结构体指针
//}

int main() {
	//定义结构体变量并初始化
	struct S s = { 10,{3.14,3.2f},'c'};
	scanf("%lf %f",&(s.p.d), &(s.p.f));  
	//打印
	printf("%d %.2lf %.1f %c\n", s.a, s.p.d, s.p.f, s.c);
	//Print1(s); //传值调用
	//Print2(&s); //传址调用

	return 0;
}

在这里插入图片描述


总结

关于结构体,大家可以理解成和int char double 一样的类型,只不过结构体可以包含的东西很多,是这些变量的一个集合,结构体在编程中是很重要的存在,这一篇博客带领大家梳理了一遍结构体的基本知识,相信大家有很深的收获!


客官读到这里了,来个三连支持一下吧!!!

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
C语言结构体是一种用户自定义的数据类型,它允许我们存储不同类型的数据在一个内存中。结构体是由多个成员组成的,每个成员可以是任意数据类型,可以是基本数据类型(如整数、浮点数、字符等),也可以是其他结构体类型或指针类型。结构体可以用来描述现实中的复杂对象或数据结构,例如学生、员工、图书等,方便我们对其进行操作和管理。 使用结构体可以将相关的数据和功能封装在一起,提高代码的可读性和可维护性。通过定义一个结构体类型,我们可以创建该类型的变量,并通过变量名来访问结构体的成员。结构体成员的访问可以使用"."运算符来进行,例如:"struct_name.member_name"。 在C语言中,可以通过以下方式定义一个结构体: ``` struct 结构体名称 { 数据类型 成员1; 数据类型 成员2; ... }; ``` 可以使用typedef关键字来给结构体类型定义一个别名,方便后续使用。 结构体的使用可以参考下面的例子: ``` #include<stdio.h> // 定义一个结构体类型 struct Student { int id; char name[20]; int age; }; int main() { // 声明一个结构体变量 struct Student stu; // 给结构体的成员赋值 stu.id = 123; strcpy(stu.name, "Tom"); stu.age = 18; // 打印结构体的成员 printf("Student ID: %d\n", stu.id); printf("Student Name: %s\n", stu.name); printf("Student Age: %d\n", stu.age); return 0; } ``` 以上代码定义了一个名为"Student"的结构体类型,包含id、name和age三个成员。在main函数中,声明了一个名为"stu"的结构体变量,并给成员赋值。然后通过printf函数打印出结构体成员的值。 总的来说,C语言结构体是一种灵活、强大的数据类型,可以用来组织和操作复杂的数据结构,提高程序的可读性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2022horse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值