初始结构体

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言初阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:介绍c语言中的新知识—结构体想关的知识.
金句分享:
✨今天所有的混乱与芜杂,努力与精进,都将在进步中变得更加清晰.✨

目录

  • 前言
  • 一、结构体的声明
  • 二、结构体变量的定义与初始化
  • 三、结构体传参

结构体是什么?

结构体是用来描述复杂对象的一种
变量,结构体中的成员可以是多种不同类型的变量.

例如:结构的成员可以是
标量
数组
指针,甚至是其他
结构体.

例如:描述一名学生,一间房子……
这时我们就可以使用结构体来很好的表述这些对象.

一、结构体的声明

格式:

struct 结构体类型名字
{
  结构体中的成员
}(全局结构体变量);

🌰栗子
声明一个结构体类型,使其可以描述学生对象,学生信息包含,

姓名
年龄
性别
身高
学号

//结构体类型的声明
struct stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	double stature;//身高
	char id[20];//学号
};

这段代码表示声明了一个结构体类型名为struct stu,成员就是不同类型的成员变量.

二、结构体变量的定义与初始化

当我们声明结构体的类型之后,接下来就要对结构体进行定义初始化了.

1)定义初始化 全局结构体变量:有两种方法

方法一:在声明结构体变量最后的分号前,可以定义和初始化全局结构体变量.
方法二:与其它全局变量一样,在主函数(main())外面定义即可.

提示一下:在操作符章节提到了结构体成员访问操作符(.)

#include <stdio.h>
 struct stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s3={"高启强",35,"男","2015666"};//此处的stu表示一个全局结构体变量

struct stu s4 = { "安欣",30,"男","2018888"};//定义全局结构体变量s4并初始化
int main()
{
	//局部变量的定义与初始化
	struct stu s1 = { "初阶牛",19,"男","2021666" };
	struct stu s2 = { "青鸟",19,"女","2021888" };
	//打印
	printf("%-8s %-2d %s %s \n", s1.name, s1.age, s1.sex, s1.id);
	printf("%-8s %-2d %s %s \n", s2.name, s2.age, s2.sex, s2.id);
	printf("%-8s %-2d %s %s \n", s3.name, s3.age, s3.sex, s3.id);
	printf("%-8s %-2d %s %s \n", s4.name, s4.age, s4.sex, s4.id);
	return 0;
}

上面有提到,结构体变量的成员可以是结构体,下面举例介绍嵌套结构体定义初始化
补充知识,当我们每次定义结构体变量时,结构体的类型名显得有点繁琐时,我们可以使用typedef关键字进行重命名.
结构体

#include <stdio.h>
typedef struct teacher ter;//重命名是结构体的类型更简便
typedef struct student stu;
struct teacher
{
	char name[20];//名字
	char subject[20];//科目

};//此处的stu表示一个全局结构体变量
struct student
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
	ter teacher;

};

stu s1 = { "老默",40,"男","2014555",{"张三","语文"} };//定义全局的结构体变量
int main()
{
	stu s2 = { "李响",38,"男","2016555",{"李四","英语"} };//定义局部的结构体变量
	//打印:
	printf("%-8s %-2d %s %s %s %s\n", s1.name, s1.age, s1.sex, s1.id, s1.teacher.name, s1.teacher.subject);
	printf("%-8s %-2d %s %s %s %s\n", s2.name, s2.age, s2.sex, s2.id, s2.teacher.name, s2.teacher.subject);
	return 0;
}

三、结构体传参

当我们将结构体变量作为函数参数进行传参的 时候,应该怎样接收并使用的呢?
我们可能会觉得上面的打印显得较为繁琐,我们不妨将打印封装为一个函数,打印时直接调用该函数呢?
🌰栗子:结构体打印函数

#include <stdio.h>
typedef struct teacher ter;//重命名是结构体的类型更简便
typedef struct student stu;
struct teacher
{
	char name[20];//名字
	char subject[20];//科目

};//此处的stu表示一个全局结构体变量
struct student
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
	ter teacher;

};

stu s1 = { "老默",40,"男","2014555",{"张三","语文"} };//定义全局的结构体变量


void print1(stu s)//传值调用
{
	printf("%-8s %-2d %s %s %s %s\n", s.name, s.age, s.sex, s.id, s.teacher.name, s.teacher.subject);
}
void print2(stu* s)//传址调用
{
	printf("%-8s %-2d %s %s %s %s\n", (*s).name, (*s).age, (*s).sex, (*s).id, (*s).teacher.name, (*s).teacher.subject);
	//上行代码可简化为下一行代码,			(s).等价于->
	//printf("%-8s %-2d %s %s %s %s\n", s->name,  s->age,  s->sex,  s->id,  s->teacher.name,  s->teacher.subject);
}
int main()
{
	stu s2 = { "李响",38,"男","2016555",{"李四","英语"} };//定义局部的结构体变量
	//打印:
	print1(s1);//传值调用
	print2(&s2);//传址调用
	return 0;
}

问题:试着想一想,print1函数与print2函数谁更优呢?

答案:print2,因为传值调用会向内存申请空间,无论是时间还是空间上都要耗费,再加上结构体内存大小一般都比较大(在后续会将结构体所占的内存计算)
所以传址调用更优.

这篇文章主要是初步了解结构体,

  1. 知道结构体是什么,

  2. 如何使用结构体描述对象

  3. 结构体的简单传参

结构体的所占内存大小计算稍微复杂一些,后续会单独讲.
最后希望这篇文章对大家有些帮助.
感觉支持!!!💗💗💗**

版权声明:本文为博主作者:初阶牛原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_67276605/article/details/128921467

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2024年1月11日
下一篇 2024年1月11日

相关推荐