c语言修炼第三章--结构体

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

目录

前言

3.1结构体的含义以及语法

3.1.1结构体含义

3.1.2结构体语法形式

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

3.2结构体成员的类型

3.3结构体的成员访问

3.3.1.操作符

3.3.2->操作符

3.4结构体传参


前言

小伙伴们大家好!欢迎继续和菜菜酱学习c语言呐!之前菜菜酱有事所以耽误啦,废话不多说,让我们一起开始今天的学习叭!

3.1结构体的含义以及语法

3.1.1结构体含义

结构是一些值的集合,这些值称为成员变量。结构体变量的每个成员可以是不同类型的变量这怎么么进行理解呢?大家还记得数组的含义吗?数组是一组相同类型的集合,而结构体是一组不同类型的集合!那么为什么要使用结构体呢?这是因为内置变量无法描述复杂情况,在生活中描述一个人需要年龄,性别,名字等等!接下来一起看看结构体的语法形式叭!

3.1.2结构体语法形式

struct tag
{
   member-list;
}varaible-list;

 解释:tag可以任意命名,struct tag组合成结构体标签。member-list是成员变量一般用来描述结构体对象的相关属性,varaible-list是全局变量。这整个共同组成结构体类型。用代码来看看叭!

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

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

还是以描述一个为例来看看怎么创建变量叭!

struct stu
{
	int age;
	char name[10];
	char sex[5];
}s2;//第二种方式
struct stu s1;//第一种方式
int main()
{
   //第3种方式
	struct stu s3;
	return 0;
}

现在变量已经创建好了,但是我们会发现这个类型写起来好麻烦有没有什么办法可以简化呢?酱酱们还记得typedef吗?typdedef可以对类型进行重命名,

typedef unsigned int unit

 这个代码的意思是把unsigned int 重命名为unit,但是结构体的重命名不是这种写法!

typedef struct stu
{
   member-list;
}stu;

 typedef对结构体的重命名是把重命名部分放在大括号后面分号前面!注意此时stu不再是列表变量而是重命名!此时再写结构体类型需要写stu即可不需要再写struct!在c语言中没有对结构体进行typedef,struct关键字不能省略

该怎么进行初始化呢?还记得数组是怎么经行初始化的吗?没错利用大括号,结构体的初始化也是利用结构体!上代码一起来看看叭

struct stu
{
	int age;
	char name[10];
	char sex[5];
};
int main()
{
	struct stu s = { 20,'张三','男'};
	return 0;
}

3.2结构体成员的类型

结构体成员的类型可以是标量,数组,指针,甚至是结构体!

struct stu
{
	float price;
	char name[20];
	struct stu1;
	int* p;
};
struct stu1
{
	int age;
	int* pa;
	int name[10];
};
int main()
{
	struct stu s1;
    struct stu1 s;
    return 0;

}

以上的代码包含了可能出现的所有情况。但是要是结构体的成员变量是结构体此时该怎么进行初始化呢?还是和之前一样噢,来看看叭

struct stu
{
	float price;
	char arr[20];
	struct stu1;
	int* p;
};
struct stu1
{
	int age;
	int* p;
	char arr1[10];
};
int main()
{
	struct stu s = { 80.2,'张三',{20,NULL,"bit"},NULL };
	return 0;
}

3.3结构体的成员访问

在初识c语言时我们就介绍了结构体成员访问操作符.和->,现在让我们一起来仔细了解了解叭

3.3.1.操作符

具体怎么使用,直接上代码看看叭

struct stu
{
	int age;
	char sex[5];
	char name[10];
};
int main()
{
	struct stu s1 = { 20,"男","张三" };
	printf("%d %s %s", s1.age, s1.sex, s1.name);
	return 0;
}

c语言修炼第三章--结构体,c语言

 总结一下.操作符的具体使用:结构体类型.结构体成员

3.3.2->操作符

还记得前面的介绍吗?->适用于结构体指针,再来代码看看叭!还是以介绍一个人对的年龄姓名为例,不过不同的是利用一个函数来其初始化和打印!上代码

#include<string.h>
struct stu
{
	int age;
	char name[10];
};
void set_stu(struct stu t)
{
	t.age = 20;
	strcpy(t.name, "张三");
}
void print(struct stu t)
{
	printf("%d %s", t.age, t.name);
}
int main()
{
	struct stu s1 = {0};
	set_stu(s1); 
	print(s1);
	return 0;
}

这是我们立马想到的解决办法,乍看上去貌似没有什么错误,但是运行起来就发现问题了

c语言修炼第三章--结构体,c语言

 为什么打印出来0呢?这是因为在进行函数调用时使用了传值调用,此时形参是实参的一份临时拷贝,对形参的修改并不会影响实参。此时我们不应该用传值调用而是用传址调用,传结构体的地址

struct stu
{
	int age;
	char name[10];
};
void set_stu(struct stu* t)
{
	//(*t).age = 20;
	//strcpy((*t).name, "张三");
    t->age=20;
    strcpy(t->name,"张三");
}
void print(struct stu t)
{
	printf("%d %s", t.age, t.name);
}
int main()
{
	struct stu s1 = { 0 };
	set_stu(&s1);
	print(s1);
	return 0;
}

c语言修炼第三章--结构体,c语言

 此时就可以成功打印了

总结一下:结构体指针->结构体成员

3.4结构体传参

在上面的学习中我们能发现结构体传参分为两种,传值和传址!上代码

struct stu
{
	char name[10];
	char sex[4];
	int age;
	int weight;
};
void print(struct stu s1)
{
	printf("%s %s %d %d\n", s1.name, s1.sex, s1.age, s1.weight);
}
void set(struct stu* s2)
{
	strcpy(s2->name, "张三");
	strcpy(s2->sex, "男");
	s2->age = 23;
	s2->weight = 200;
}
int main()
{
	struct stu s1 = { "张三","男",26,140 };
	print(s1);//传值
	struct stu s2 = { 0 };
	set(&s2);//传地址
	printf("%s %s %d %d\n", s2.name, s2.sex, s2.age, s2.weight);
	return 0;
}

c语言修炼第三章--结构体,c语言

传值时用.操作符,传址时用->操作符!结构体传参有两种选择哪种更合适·呢·?答案是使用传地址的更好!

原因:

  • 函数传参时需要压栈
  • 如果传递下一个结构体对象的时候结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降

结论:

结构体传参时,要传结构体的地址


关于更多结构体的内容在后面的学习中会介绍,今天的学习到此为止啦!文章来源地址https://www.toymoban.com/news/detail-599551.html

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

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

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

相关文章

  • 数据结构 第三章 线性表(三)

      🚀 写在最前: 在前面学习了单链表的基本操作,这篇文章学习 双链表 ,以及 双链表的一些基本操作 。 🚀: 求个关注😀,让我们一起探索计算机的奥秘! 双链表一个节点含有两个指针域,前指针域指向前一个节点,后一个指针域指向后一个节点; 那为什么有了单链

    2024年04月15日
    浏览(40)
  • Python基础练习题--第三章 控制结构

    目录 1025:【例3.1】购买笔记本 1026:【例3.2】判断奇偶 1027:【例3.3】区间测速 1028:【例3.4】飞船速度 1029:练3.1最大优惠价 1030:练3.2判断闰年 1031:练3.3最适宜运动心率2 1032:【例3.5】计程票 1033:【例3.6】BMI健康信息 1034:练3.4  区间测速2 1035:练3.5  购买笔记本2 【题

    2024年02月07日
    浏览(53)
  • 第三章-Java的基本程序设计结构

      3.1一个简单的Java语言程序  这是程序虽然很简单,但是所有的Java程序都具有这种结构,因此还是值得花一些时间来研究的。首先,Java区分大小写。如果出现了大小写拼写错误(例如:将main拼写成Main),程序将无法运行。 下面逐行的查看这段源代码。pubilc称为访问修

    2024年02月03日
    浏览(51)
  • 【软考数据库】第三章 数据结构与算法

    目录 3.1 数据结构 3.1.1 线性结构 3.1.2 数组 3.1.3 矩阵 3.1.4 树与二叉树 3.1.5 图 3.2 查找 3.2.1 顺序查找 3.2.2 折半查找 3.2.3 哈希表 3.3 排序 3.3.1 直接插入排序 3.3.2 希尔排序 3.3.3 简单选择排序 3.3.4 堆排序 3.3.5 冒泡排序 3.3.6 快速排序 3.3.7 归并排序 3.3.8 基数排序 3.3.9 内部排序算法

    2023年04月26日
    浏览(49)
  • 第三章:R语言编程 第六节:模块模式

    模块是一种结构,由无法从外部访问的数据以及操纵这些数据的函数组成,是标准化代码编写技术 模块模式的优点 1.因为无法从外部访问数据,所以很好的隐藏了内部实现,说人话就是无需考虑数据在模块内部是如何保存的 2.其次,因为只能借助实现定义的函数访问模块内部

    2024年03月11日
    浏览(38)
  • 数据库系统工程师——第三章 数据结构与算法

    数据结构是指 数据元素的集合 及 元素间的相互关系和构造方法 ,结构就是元素之间的关系。在数据结构中,元素之间的相互关系是数据的逻辑结构。按照逻辑关系的不同将数据结构分为线性结构和非线性结构,其中,线性结构包括线性表、栈、队列、串,非线性结构主要包

    2024年02月04日
    浏览(66)
  • 第三章:R语言编程 第五节:值传递&对象不变性

    在R语言中,一切皆为对象,同时在调用函数的时候也采用值传递的方式,即作为参数的对象会被复制,然后将副本传递给函数 例如: 这里将数据框作为参数传递给函数的时候,函数内部的修改将不会影响原对象。这是因为调用f()函数时采用的时值传递的方法;df2中保持的不

    2024年03月11日
    浏览(44)
  • (浙大陈越版)数据结构 第三章 树(上) 3.3 二叉树的遍历

    目录 3.3.1 遍历(先中后) 二叉树的遍历 先序遍历: 中序遍历 后序遍历 tips: 3.3.2 中序非递归遍历 非递归算法实现的基本思路:使用堆栈 中序遍历的非递归算法具体实现方法为: 3.3.3 层序遍历 难点 解决方法: 队列实现 思路 有如下二叉树作为例子: 遍历过程:(出队即

    2024年02月06日
    浏览(48)
  • 【数据库系统概论】第三章关系数据库标准语言SQL

    1.数据查询: SELECT:用于选择需要查询的列和行。 FROM:用于指定要查询的表。 WHERE:用于指定查询条件。 GROUP BY:用于按照指定的列对结果进行分组。 HAVING:用于指定分组条件。 ORDER BY:用于指定查询结果的排序方式。 2.数据操纵: INSERT INTO:用于将数据插入表中。 UPDAT

    2024年02月08日
    浏览(122)
  • 第三十三章:RPA与自然语言处理的安全保障

    RPA(Robotic Process Automation)和自然语言处理(NLP)是两种不同的技术领域,但它们在现实生活中的应用中有很多相互关联和相互影响的地方。在这篇文章中,我们将讨论RPA与自然语言处理的安全保障,以及如何在实际应用中保障数据安全和系统安全。 自然语言处理(NLP)是一种通过计

    2024年02月22日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包