【C语言】-- 结构体篇

这篇具有很好参考价值的文章主要介绍了【C语言】-- 结构体篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.什么是结构体?

2.为什么要有结构体? 

3.结构体的声明,定义,初始化

 1.简单的结构体创建变量

 2.加 typedef   作用是:类型重命名

 3.结构体中的结构体

 4.结构体的传址,传值

 5.结构体的传址,传值 哪种好?

创作不易,如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。 


1.什么是结构体?

就是用户自己定义的一种类型,你可以自己去定义这个类型的一系列属性。比较常用的自定义类型有:结构体, 联合体,枚举

2.为什么要有结构体? 

       由于在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩。又例如,对于记录一本书,需要 char型的书名,char型的作者名,float型的价格。在这些情况下,使用简单的基本数据类型甚至是数组都是很困难的。而有了结构体,我们可以借助它可以有效的解决这个问题。
       结构体本质上还是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。

结构体的优点:结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。
 

3.结构体的声明,定义,初始化

 1.简单的结构体创建变量


struct stu {   //结构体声明        注:struct stu 是【结构体类型名】
	char name[20];              //    s2,s3 是【变量名】
	int age;                    //    name[],age,sex[] 是【结构体成员名】
	char sex[5];
}s2,s3;   //此处可创建变量  --为全局变量 ;冒号不要忘记

struct stu s4;// 此处也可创建变量  --为全局变量 

int main() {
	struct stu s1;  //--局部变量
	return 0;
}

struct stu 是【结构体类型名】

s2,s3, s4是【变量名】且是全局变量    s1是局部变量  

name[],age,sex[] 是【结构体成员名】

2.加 typedef   作用是:类型重命名


typedef struct stu {           //这里的 S(大括号后跟的) 是 【结构体变量】
	char name[20];
	int age;
	char sex[5];

}S;    // 给【struct stu】整体起了个名【S】  

int main() {
	S s1;     //即  S 等价于 struct stu

	return 0;
}

3.结构体中的结构体


//初始化及打印

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

struct B {
	char dept[20];
	struct A a;   //在结构体中定义结构体变量
	char sno[10];
};

int main() {
	struct A aa = {"赵亦",20,"男"}; //初始化
	struct B b = { "计算机",{"赵亦",20,"男"},"001"}; //初始化
	
	printf("%s %d %s\n",aa.name,aa.age,aa.sex);
	printf("%s %s %d %s %s",b.dept,b.a.name,b.a.age,b.a.sex,b.sno);
	
	return 0;
}

4.结构体的传址,传值

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

void set_st(struct st s) {  //传值 不能改变原有的
	s.age = 20;
	strcpy(s.name,"赵亦");
	strcpy(s.sex,"男");

	//s.name = "赵亦";   //这种形式是错误的name,sex 为数组名,指针 不能为左值
	//s.sex = "男";

}
void set_stt(struct st *ss) {  //传址 可改变原有的
	ss->age = 20;
	strcpy(ss->name, "赵亦");
	strcpy(ss->sex,"男");
	//printf("%s %d %s", ss->name, ss->age, ss->sex);
	
	//或者下面形式  【即ss->age 等价于 (*ss).age】
	//(*ss).age = 20;
	//strcpy((*ss).name, "赵亦");
	//strcpy((*ss).sex, "男");
	//printf("%s %d %s", (*ss).name,(*ss).age,(*ss).sex);

}

void print_st(struct st s) {

	printf("%s %d %s\n",s.name,s.age,s.sex );

}

int main() {

	struct st s = { 0 }; //初始化结构体
	struct st ss = { 0 };

	set_st(s);  //结构体传值
	print_st(s);  
	set_stt(&ss);  //结构体传址
	print_st(ss);

	return 0;
}

5.结构体的传址,传值 哪种好?

在一般情况下,我们都是会去传址的,不仅因为它快,高效。而是如果传值,函数在传参的时候是需要压栈的,若此时结构体过大,参数压栈时系统的开销也就较大,会导致性能的下降。

并且传址不管你结构体有多大,我传递的地址永远是4/8个字节,开销远比传值小得多。故首选传址。

那有时候我们传值的目的是只使用访问而不改变原有的数据。如果都传址,万一不小心改变数据该怎么办。这里根据自己的使用场景,可以加const,从而防止数据改变。文章来源地址https://www.toymoban.com/news/detail-570854.html

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

void set_stt(const struct  st  * ss) {  //加const传址 原数据不能被改变
	//ss->age = 20;  会报错
	//(*ss).age = 20; 会报错
	printf("%s %d %s", ss->name, ss->age, ss->sex);
}

int main() {

	struct st ss = { 0 };
	set_stt(&ss);
	
	return 0;
}

创作不易,如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。 

到了这里,关于【C语言】-- 结构体篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构——排序算法(C语言)

    本篇将详细讲一下以下排序算法: 直接插入排序 希尔排序 选择排序 快速排序 归并排序 计数排序 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某写的大小,按照递增或递减0排列起来的操作。 稳定性的概念 假定在待排序的记录序列中,存在多个

    2024年02月08日
    浏览(66)
  • C语言数据结构与算法

    冒泡排序 例题 顺序表下的 冒泡排序 注意:冒泡排序 稳定,最多执行n(n-1)/2次 选择排序不稳定,平均比较次数n(n-1)/2 直接插入排序,是在有序基础上,速度最快且稳定的排序方法。 希尔排序是 不稳定的 顺序查找 二分查找(非递归) 二分查找(递归) 数组 链表 查询 快 慢

    2024年02月06日
    浏览(74)
  • C语言算法笔记1:结构体、结构体数组实战讲解

    今日开始为电赛复习一些必备的算法知识,本文回顾复习结构体的概念以及一些基本操作,每个知识点都有代码实践演示,可以复制测试查看! 目录 前言——往日的困惑: 一、结构体基础知识与用途: C语言结构体是一种自定义数据类型: 结构体可以包含不同的数据类型:

    2024年02月12日
    浏览(41)
  • (C语言)数据结构算法-病毒感染检测(BF算法&&KMP算法)

    病毒感染检测: 医学研究者最近发现了某些新病毒,得知它们的DNA序列都是环状的。为了快速检测出患者是否感染了相应的病毒,研究者将患者的DNA和病毒的DNA均表示成一些字母组成的字符串序列,然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人

    2024年02月08日
    浏览(49)
  • C语言 数据结构--栈 括号匹配算法

    今天这一期使用栈来完成括号匹配算法 ① 栈结构 ② 初始化栈 ③ 入栈 ④ 出栈 ⑤ 判断栈是否为空 ⑤ 括号匹配 完整代码: 结果: (1)括号序列为char str[]={\\\'(\\\',\\\'{\\\',\\\'[\\\',\\\']\\\',\\\'}\\\',\\\')\\\'}; (2)括号序列为char str1[]={\\\'{\\\',\\\'(\\\',\\\'}\\\',\\\']\\\'};    

    2024年02月05日
    浏览(54)
  • C语言 数据结构与算法 I

    因为之前写算法都是用C++,也有了些C++基础,变量常量数据类型就跳过去吧。 首先是环境,学C++时候用Clion,C语言也用它写吧~ 新建项目,选C执行文件,语言标准。。。就先默认C99吧,反正是测试环境,应该问题不大 直接运行一手 嗯。。JB家的新UI。。真是。。。。。。。一

    2024年02月09日
    浏览(42)
  • 数据结构与算法——排序(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月09日
    浏览(59)
  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(44)
  • 『初阶数据结构 • C语言』② - 算法为何重要

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。   算法这个词听起来很深奥,其实不然。它只是解决某个问题的一套流程。  准备一碗麦片的流程也可以说是一种算法,它包含以下 4步(对我来说

    2024年02月14日
    浏览(39)
  • 内部排序算法比较-数据结构C语言课设

    名称: 内部排序算法比较 内容: 在教科书中,各种内部排序算法的时间复杂的分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机数据比较各种算法的比较次数和移动次数,以取得直观感受。 任务: (1)对以下7中常会用的内部排序算法进行比较

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包