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

news2024/11/30 15:31:51

目录

前言

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;
}

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

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;
}

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

 为什么打印出来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;
}

 此时就可以成功打印了

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

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;
}

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

原因:

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

结论:

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


关于更多结构体的内容在后面的学习中会介绍,今天的学习到此为止啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python零基础入门(八)——字典与集合

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

zookeeper伪分布式安装

1、环境准备 需要有jdk1.8 2、安装 &#xff08;1&#xff09;将zookeeper的安装包上传到/opt/modules目录下 &#xff08;2&#xff09;解压 [rootdatacollection modules]# tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /opt/installs/&#xff08;3&#xff09;更名…

nacos配置管理模型

nacos配置管理模型 Nacos&#xff08;全称为"Naming and Configuration Service"&#xff09;是阿里巴巴开源的一款用于实现服务发现、动态配置和服务管理的产品。它提供了面向微服务架构的注册中心、配置中心和命名服务&#xff0c;并以高可用性、可扩展性和容错性…

SQL Server 存储过程入门

SQL Server 存储过程入门 1.存储过程的定义&#xff1a;2.存储过程的作用与好处&#xff1a;3.存储过程的基本语法&#xff1a;&#xff08;1&#xff09;创建&#xff08;2&#xff09;使用 4.存储过程的3个示例&#xff1a;&#xff08;1&#xff09;创建一个Contact表的名为…

6.6Jmeter远程调度Linux机器Jmeter测试

1、配置Agent和启动 1.1、打开jmeter/bin目录下的jmeter.properties 1、server_port1099取消注释 2、remote_hosts127.0.0.1 改为remote_hosts127.0.0.1:1099 或者是remote_hostsAgent机的ip:1099 3、server.rmi.localport1099 4、server.rmi.ssl.disablefalse改为true&#x…

MySQL5.7升为8.0新指南

MySQL5.7升为8.0新指南 一、效果图 俗话说的好&#xff1a;有图有真相 升级前 升级后 二、核心思路 以官方教程为主&#xff0c;各种博文为辅&#xff0c;实践出真知 官方教程网址&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/windows-upgrading.html 重点内容重…

微信小程序——字符串截取

indexOf() &#xff1a; 判断一个字符是否在字符串 中 存在&#xff0c;如果存在返回该元素或字符第一次出现 的 位置 的 索引&#xff0c;不存在返回-1。 lastIndexOf() &#xff1a; 返回一个指定的字符串值最后出现的位置&#xff0c;在一个字符串中的指定位置从后向前搜索。…

Go语言之文件操作,读写文件,其他文件操作

编码 ASCII表 众所周知&#xff0c;计算机起源于美国&#xff0c;英文只有26个字符&#xff0c;算上其他所有特殊符号也不会超过128个。字节是计算机的基本储存单位&#xff0c;一个字节(bytes)包括八个比特位(bit),能够表示出256个二进制数字&#xff0c;所以美国人在这里只是…

大语言模型:从应用到产出;百度网盘推出AI的图搜功能

&#x1f989; AI新闻 &#x1f680; 百度网盘推出基于AI的高级图搜功能&#xff0c;提供更精确、全面的搜索结果 摘要&#xff1a;百度网盘近日推出了一项名为“高级图搜”的AI功能。通过基于向量的语义搜索&#xff0c;该功能可以理解时间、地点、人物、事件等组合搜索语句…

LeetCode 热题 100(二):滑动窗口。3. 无重复字符的最长子串、 438.找到字符串中所有字母异位词

滑动窗口例题&#xff1a; 一、3. 无重复字符的最长子串 题目要求&#xff1a;就是说找到包含不同字母最长的串。 思路&#xff1a;可以想到使用set去重&#xff0c;同时应用滑动窗口。本质上还是双指针法&#xff0c;l是窗口左边界 r是窗口右边界。 如果set包含了当前字母就…

Can总线概述

1&#xff1a;Can总线简介 CAN总线是控制器局域网络&#xff08;Controller Area Network&#xff0c;CAN&#xff09;的简称&#xff0c;由德国BOSCH公司开发&#xff0c;并最终成为国际标准&#xff08;ISO 11898-1&#xff09;&#xff0c;是一种串行数据通信总线。 在当前…

webpack-theme-color-replacer+elementui自定义配置主题色

webpack-theme-color-replacer原理是通过获取到配置数组里的颜色值&#xff0c;在触发换色方法时&#xff0c;elementui使用的颜色值存在与配置表中颜色一致的颜色&#xff0c;则改颜色会被替换成新的颜色值。 若是自定义的css文件&#xff0c;需要配置css文件路径 若是需要修…

视频弹题、视频答题来实现视频防录屏和防挂机

视频弹题、视频答题来实现视频防录屏和防挂机 1.视频播放到某个时间点&#xff0c;弹出问题卡&#xff0c;学员只有正确回答课件视频中弹出的问题之后才能继续观看视频。 2.通过互动问答的方式&#xff0c;不仅有利于巩固前边学习的知识点&#xff0c;评估学员的学习效果&#…

ShardingSphere分库分表实战之水平分库和水平分表

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

边框动画 单边追随

时间短就直接看第三个使用 clip-path animation 完成。 <!DOCTYPE html> <html><head><style>/* 第一个 */.btn {width: 100px;height: 40px;background: yellow;position: relative;display: flex;align-items: center;justify-content: center;bor…

Unity游戏源码分享-单车骑行游戏

Unity游戏源码分享-单车骑行游戏 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88057717

【问题总结】Docker环境下备份和恢复postgresql数据库

目录 文章目录 以从备份恢复forest_resources库为例一、备份数据库二、需要还原的数据库准备1 删除掉远程的库。2 重新创建一个空的库。可以使用sql3 找到数据库存放的路径&#xff0c;并将备份文件上传到对应的路径下 三、 进入docker容器内部&#xff0c;执行数据库恢复附录…

C++拷贝构造函数原理解析

喵~ 一、构造函数1.1 默认构造函数1.2 自定义的默认构造函数1.3 自定义带参数的构造函数 二、拷贝构造函数的基本使用2.1 浅拷贝和深拷贝&#xff08;原理及区别&#xff09; 一、构造函数 在C面向对象的学习中&#xff0c;对于构造函数应该并不陌生&#xff0c;有默认的构造函…

第47节:cesium 热力图效果(含源码+视频)

结果示例: 完整源码: index.html中增加<script src="./static/lib/heatmap.js"></script> heatmap.js /** heatmap.js v2.0.5 | JavaScript Heatmap Library** Copyright 2008-2016 Patrick Wied <heatmapjs@patrick-wied.at> - All rights re…

了解 3DS MAX 3D摄像机跟踪设置:第 7 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 在SynthEyes中跟踪素材 步骤 1 打开SynthEyes软件。 打开合成之眼 步骤 2 在跟踪素材之前&#xff0c;您需要设置首选项。因为&#xff0c;你 稍后将在 3ds Max 中工作&#xff0c;必须根据 3ds Max…