【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语言数据结构与算法

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

    2024年02月06日
    浏览(70)
  • 数据结构——排序算法(C语言)

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

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

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

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

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

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

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

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

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

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

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

    2024年02月05日
    浏览(53)
  • 【学习笔记】数据结构算法文档(类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日
    浏览(42)
  • 【数据结构与算法】魔王语言解释(C/C++)

    有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的: 形式一 α → β 1 β 2 . . . β m alpha to beta _{1} beta_{2}...beta_{m} α → β 1 ​ β 2 ​

    2024年02月07日
    浏览(43)
  • [数据结构-C语言] 算法的时间复杂度

    目录 1.算法的复杂度 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 3、常见时间复杂度计算举例 3.1 冒泡排序 3.2 二分查找 3.3 阶乘递归 3.4 斐波那契数列 1.算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此 衡量一个算法的

    2024年02月02日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包