C语言初阶————结构体

2026年1月10日学习总结:

今天开启了初阶的新篇章------结构体,关于结构体的相关内容主要分为以下三个部分:

(1)结构体的声明和结构体变量的初始化

1.结构体的基础知识

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

与数组的区别:数组是相同类型的集合,而结构体可以是不同类型变量的集合。

如何更好理解呢?

可以理解为结构体是一种定义复杂对象的一种描述方式,常见的复杂对象有人(包含姓名,电话,性别,身高等)、书(包含书名,作者,定价,书号等)等,而该方式内可以用不同的内置类型(如int、long、char、double等)来帮助描述。

2.结构体的声明形式: struct tag

{

member_list;

}variable_list; 其中struct结构体关键字,tag结构体标签(可以自定义),member_list成员列表(可一个或多个), variable_list使用该类型创建的变量(可有可无,一般不建议使用)。

3.结构体成员的类型:可以是标量、数组、指针、甚至是其他结构体。

结构体变量的创建和初始化:

cs 复制代码
struct pro
{
	char name[20];
	char tele[20];
	char sex[4];
	int high;
}p1;//使用上述方法创建变量,在该位置为全局变量
struct pro p2;//使用创建好的结构体类型创建变量
struct st
{
	struct pro p;//其他结构体(前提是使用的结构体需要在该结构体之前已经定义)
	char num[18];
	float f;
};
//以上两种方法均可在主函数(main)中创建
int main()
{
	struct pro p3 = { "张三","12348889560","男",181 };//创建和初始化可以一起
	struct st s = { {"lisi","1592398888","女",168},50,3.14 };//变量中有其他结构体的初始化
	return 0;
}

(2)结构体成员变量的访问

1.通过结构体变量访问成员变量:

使用点操作符(.)进行访问,点操作符接受两个操作数

基本形式:结构体变量.成员变量

cs 复制代码
int main()
{
	struct pro p3 = { "王五","18266698888","女",170 };
	struct st s = { {"lisi","1592398888","女",168},"50",3.14 };
	printf("%s %s %s %d\n", p3.name, p3.tele, p3.sex, p3.high);
	printf("%s %s %s %d %s %s %f\n", s.p.name, s.p.tele, s.p.sex, s.p.high, s.num, s.f);
	return 0;
}

2.通过结构体指针访问指向变量的成员

①使用点操作符:(*结构体指针).成员变量 ②使用->操作符:结构体指针->成员变量

cs 复制代码
//使用点操作符:(*结构体指针).成员变量
void print1(struct pro* p)
{
	printf("%s %s %s %d\n", (*p).name, (*p).tele, (*p).sex, (*p).high);
}

//使用->操作符:结构体指针->成员变量
void print2(struct pro* p)
{
	printf("%s %s %s %d\n", p->name, p->tele, p->sex, p->high);
}

int main()
{
	struct pro p3 = { "王五","18266698888","女",170 };
	struct st s = { {"lisi","1592398888","女",168},"50",3.14 };
	printf("%s %s %s %d\n", p3.name, p3.tele, p3.sex, p3.high);
	printf("%s %s %s %d %s %f\n", s.p.name, s.p.tele, s.p.sex, s.p.high, s.num, s.f);
	print1(&p3);
	print2(&p3);
	return 0;
}

(3)结构体传参 1.结构体变量传参 2.结构体指针传参

cs 复制代码
//①结构体变量传参
void print3(struct pro p)
{
	printf("%s %s %s %d\n", p.name, p.tele, p.sex, p.high);
}
//②结构体指针传参
void print4(struct pro* p)
{
	printf("%s %s %s %d\n", p->name, p->tele, p->sex, p->high);
}
int main()
{
	struct pro p3 = { "王五","18266698888","女",170 };
	struct st s = { {"lisi","1592398888","女",168},"50",3.14 };
	print3(p3);
	print4(&p3);
	return 0;
}

以上两种传参方法中首选结构体指针传参

原因:传参时需要压栈,如果一个传递的结构体过大,参数压栈的系统开销比较大,会导致性能下降。

相关推荐
weixin_445054729 小时前
力扣热题52
开发语言·python
逑之9 小时前
C语言笔记2:C语言数据类型和变量
c语言·开发语言·笔记
何中应9 小时前
@Autowrited和@Resource注解的区别及使用场景
java·开发语言·spring boot·后端·spring
源代码•宸9 小时前
Golang语法进阶(Context)
开发语言·后端·算法·golang·context·withvalue·withcancel
一条咸鱼_SaltyFish9 小时前
[Day16] Bug 排查记录:若依框架二次开发中的经验与教训 contract-security-ruoyi
java·开发语言·经验分享·微服务·架构·bug·开源软件
源代码•宸9 小时前
Golang语法进阶(Sync、Select)
开发语言·经验分享·后端·算法·golang·select·pool
一勺菠萝丶9 小时前
Java 对接 PLC 实战:西门子 PLC 与永宏 PLC 通讯方式全面对比
java·开发语言·python
吴声子夜歌9 小时前
Java数据结构与算法——数论问题
java·开发语言
Miketutu9 小时前
Flutter - 布局
开发语言·javascript·ecmascript