【C语言】结构类型的定义和使用
目录
1.结构体(struct)类型
2.结构标记
3.typedef
4.定义结构数组的方法
5.调用结构数组的方法
6.将结构体传入函数
7.结构体使用实例
1.结构体(struct)类型
在C语言中,结构体(struct)类型是一种用户自定义的复合数据类型,用于组合不同类型的数据成员在一个单独的对象中。结构体类型的定义可以包含多个数据成员,每个数据成员可以是不同的数据类型。结构体类型的语法如下:
struct 结构体名 {数据类型 成员名1;数据类型 成员名2;// ...
};
以下是一个示例:
struct student {int id;char name[20];int age;float score;
};
上述代码定义了一个名为student
的结构体类型,包含了四个数据成员:id
、name
、age
和score
,分别为整型、字符数组型、整型和浮点型。该结构体类型可以用于定义表示学生的对象,每个对象包括了学生的ID、姓名、年龄和分数。结构体类型创建后,需要通过声明一个结构体变量来实际分配内存,例如:
struct student s; // 声明一个名为s的结构体变量,表示一个学生
s.id = 1001; // 设置学生的ID为1001
strncpy(s.name, "Tom", sizeof(s.name)); // 设置学生的姓名为Tom
s.age = 20; // 设置学生的年纪为20
s.score = 90.5; // 设置学生的分数为90.5
2.结构标记
C语言中,结构标记指的是定义一个结构体类型的名称,而不是直接定义结构体变量。结构标记的声明格式如下:
struct 结构体名称;
例如,以下是一个结构标记的声明:
struct student;
这个声明定义了一个名为"student"的结构体类型,但没有定义具体的结构体成员。这是因为结构标记只是为结构体类型分配了一个名称,而没有为它分配内存空间。
结构标记的主要作用是方便在后面的代码中使用结构体类型。可以使用结构标记名称来声明结构体变量、作为函数参数类型以及作为函数返回类型等。
3.typedef
C语言中,typedef是一种定义类型别名的关键字。它的用法如下:
- 声明简单类型别名
typedef 原类型别名 新类型别名;
例如:
typedef int INT;
INT a = 1;
这样将int
类型的a
定义为INT
类型的变量。
- 声明结构体类型别名
typedef struct 原类型别名 新类型别名;
例如:
typedef struct date {int year;int month;int day;
} DATE;
DATE d = {2021, 10, 1};
这样将struct date
类型的d
定义为DATE
类型的变量。
- 声明指针类型别名
typedef 原类型别名 * 新类型别名;
例如:
typedef int * PTR_INT;
int i = 1;
PTR_INT ptr_i;
ptr_i = &i;
这样将int
类型的指针定义为PTR_INT
类型的指针变量。
使用typedef可以使代码更加简洁易懂,提高代码的可读性。
4.定义结构数组的方法
定义结构数组的方法如下:
struct student {char name[20];int age;char gender;
};struct student stu[3]; // 定义一个包含3个元素的结构数组
这里定义了一个结构体 student
,包含了学生的姓名、年龄和性别,然后通过结构体定义一个包含3个元素的结构数组 stu
。
5.调用结构数组的方法
调用结构数组的方法如下:
#include <stdio.h>int main() {struct student stu[3] = {{"Tom", 18, 'M'},{"Lucy", 19, 'F'},{"John", 20, 'M'}};for(int i = 0; i < 3; i++) {printf("Name: %s\n", stu[i].name);printf("Age: %d\n", stu[i].age);printf("Gender: %c\n", stu[i].gender);}return 0;
}
这里通过初始化方式给结构数组赋值,然后使用 for
循环输出每个学生的信息。在输出时使用了结构体成员连接运算符 .(点号)
来访问每个学生的姓名、年龄和性别。
C语言中的结构体是一种自定义的数据类型,可以包含多个不同类型的数据成员。结构体的定义可以在函数内部或外部,格式为:
struct 结构体名 {数据类型 成员名1;数据类型 成员名2;...
};
其中,结构体名是自己定义的,可以起任何名字。成员名也可以任意取名,但要符合C语言的命名规则。
结构体变量定义格式为:
struct 结构体名 变量名;
访问结构体成员时使用“.”操作符,格式为:
变量名.成员名
例如:
struct student {char name[20];int age;float score;
};int main() {struct student s1;strcpy(s1.name, "Tom");s1.age = 18;s1.score = 88.5;printf("%s's age is %d, score is %.1f\n", s1.name, s1.age, s1.score);return 0;
}
输出结果为:
Tom's age is 18, score is 88.5
6.将结构体传入函数
结构体可以像其他数据类型一样传递给函数。下面是一些示例代码:
假设有以下结构体:
typedef struct Person {char name[30];int age;
} Person;
- 将结构体作为函数参数
将结构体作为函数的参数,可以通过值传递或指针传递。
void print_person(Person p) {printf("姓名:%s,年龄:%d\n", p.name, p.age);
}void update_person(Person *p) {p->age += 1;
}
在这个示例代码中,我们定义了两个函数。print_person函数用于打印结构体Person中的信息,update_person函数用于修改结构体Person中的信息。print_person函数使用的是值传递,即将结构体Person的值作为参数传递给函数。update_person函数使用的是指针传递,即将结构体Person的指针作为参数传递给函数。
- 将结构体指针作为函数参数
如果要在函数中修改结构体的值,可以将结构体的指针作为参数传递给函数。这样可以避免在函数内部创建新的结构体副本。
void update_person(Person *p) {p->age += 1;
}
在此示例代码中,我们定义了一个update_person函数,它使用了指针传递。函数使用->运算符来访问结构体中的成员。
调用上述函数的方法如下:
Person person = {"Tom", 20};
print_person(person); // 输出 "姓名:Tom,年龄:20"
update_person(&person);
print_person(person); // 输出 "姓名:Tom,年龄:21"
7.结构体使用实例
利用结构体求投票数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_CANDIDATES 10// 候选人结构体
typedef struct Candidate {char name[50]; // 候选人名字int vote_count; // 票数
} Candidate;int main() {int num_candidates;Candidate candidates[MAX_CANDIDATES];// 获取候选人数量printf("请输入候选人数量(最多%d个):", MAX_CANDIDATES);scanf("%d", &num_candidates);getchar(); // 消耗输入缓冲区中的换行符// 获取候选人信息for (int i = 0; i < num_candidates; i++) {printf("请输入候选人%d的名字:", i+1);fgets(candidates[i].name, 50, stdin);candidates[i].name[strcspn(candidates[i].name, "\n")] = '\0'; // 去除输入缓冲区中的换行符candidates[i].vote_count = 0; // 初始化票数为0}// 投票while (1) {char candidate_name[50];printf("请输入你要投票的候选人名字(输入exit结束投票):");fgets(candidate_name, 50, stdin);candidate_name[strcspn(candidate_name, "\n")] = '\0';if (strcmp(candidate_name, "exit") == 0) {break;}int found = 0;for (int i = 0; i < num_candidates; i++) {if (strcmp(candidate_name, candidates[i].name) == 0) {candidates[i].vote_count++;found = 1;break;}}if (!found) {printf("没有找到名为%s的候选人,请重新输入。\n", candidate_name);}}// 输出投票结果printf("投票结果:\n");for (int i = 0; i < num_candidates; i++) {printf("%s: %d 票\n", candidates[i].name, candidates[i].vote_count);}return 0;
}
在这个例子中,我们定义了一个候选人结构体,包含了候选人的名字和票数。在程序运行时,首先获取候选人数量和候选人信息,并初始化各个候选人的票数为0。然后,利用一个循环获取用户输入的投票信息,直到用户输入exit为止。每次获取到用户输入的候选人名字后,我们遍历候选人数组,查找是否有对应的候选人。如果找到了,则给该候选人的票数加1;否则输出错误提示信息。最后,我们输出投票结果,显示每个候选人的名字和票数。
相关文章:
【C语言】结构类型的定义和使用
目录 1.结构体(struct)类型 2.结构标记 3.typedef 4.定义结构数组的方法 5.调用结构数组的方法 6.将结构体传入函数 7.结构体使用实例 1.结构体(struct)类型 在C语言中,结构体(struct…...
C++内存管理:其二、数组内存管理
一、new一个对象数组 如果我们想在堆内存上创建一个对象数组,可以这么写: Complex * pca new Complex[3]; 主要做三件事: (1)申请一块内存,足够放置三个Complex对象。 (2)执行三次…...
No169.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
Hadoop设置hdfs全局指令
在终端进入用户个人环境变量配置文件 vim ~/.bashrc 然后添加如下内容 export PATH$PATH:/usr/local/hadoop/bin 添加到你的hadoop下载目录的bin目录为止就可以了 重新激活一下配置文件 source ~/.bashrc hdfs有专属于自己的文件存储目录,加上特殊的指令就可以箱终端一…...
IDEA 2023.1.3图文安装教程及下载
IDEA 2023.1 最新变化是在 IDEA 2023.1 中,对新 UI 做出了大量改进。实现了性能增强,从而更快导入 Maven,以及在打开项目时更早提供 IDE 功能。 新版本通过后台提交检查提供了简化的提交流程。 IntelliJ IDEA Ultimate 现在支持 Spring Secur…...
【JVM】运行时数据区(内存区域划分)详解
文章目录 前言一、JVM 运行时数据区1, 堆2, Java 虚拟机栈3, 本地方法栈4, 程序计数器5, 元数据区 / 方法区 二、内存异常问题1, 栈溢出2, 内存溢出3, 内存泄露 总结 前言 📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通…...
Python-Scrapy框架(框架学习)
一、概述 Scrapy是一个用于爬取网站数据的Python框架,可以用来抓取web站点并从页面中提取结构化的数据。 基本组件: 引擎(Engine):负责控制整个爬虫的流程,包括调度请求、处理请求和响应等。 调度器(Scheduler):负责…...
flink生成水位线记录方式--基于特殊记录的水位线生成器
背景 在flink基于事件的时间处理中,水位线记录的生成是一个很重要的环节,本文就来记录下几种水位线记录的生成方式的其中一种:基于特殊记录的水位线生成器 基于特殊记录的水位线生成器 我们发送的事件中,如果带有某条特殊记录的…...
Arcgis日常天坑问题(1)——将Revit模型转为slpk数据卡住不前
这段时间碰到这么一个问题,revit模型在arcgis pro里导出slpk的时候,卡在98%一直不动,大约有两个小时。 首先想到的是revit模型过大,接近300M。然后各种减小模型测试,还是一样的问题,大概花了两天的时间&am…...
JavaWeb:上传文件
1.建普通maven项目,或者maven项目,这里以普通maven为例,区别的jar包的导入方式啦 到中央仓库下载哦 2.结构 3.写fileservlet public class FileServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpSe…...
STM32 大小端与字节对齐使用记录
大小端 串口数据包解析 MDK stm32 小段模式 接收到的数据包: DD 03 00 1B 11 59 00 00 00 00 17 70 00 00 2F 39 00 00 00 00 00 03 23 64 00 0E 02 0B 6E 0B 84 FC EA 77 其中数据内容为: DD 03 00 1B 11 59 //电压mV 00 00 00 00 17 70 …...
RabbitMQ中basic**方法汇总与参数解释
当使用RabbitMQ进行消息传递时,Channel对象提供了一组称为"basic方法"的方法,用于执行最基本的消息传递操作。在本篇博客中,我们将详细介绍这些方法,包括示例和参数解释。 1. basicPublish 方法 basicPublish 方法用于…...
linux之/etc/default/useradd文件
/etc/default/useradd文件是在使用useradd添加用户时,一个需要调用的默认的配置文件之一,可以使用命令"useradd -D"进行修改。 useradd用法: [rootcentos79-3 mail]# useradd --help Usage: useradd [options] LOGINuseradd -Dus…...
3.primitive主数据类型和引用 认识变量
3.1 声明变量 Java注重类型。它不会让你做出把长颈鹿类型变量装进兔子类型变量中这种诡异又危险的举动——如果有人对长颈鹿调用“跳跃”这个方法会发生什么样的悲剧?并且它也不会让你将浮点数类型变量放进整数类型的变量中,除非你先跟编译器确认过数字…...
【群智能算法改进】一种改进的光学显微镜算法 IOMA算法[1]【Matlab代码#60】
文章目录 【获取资源请见文章第5节:资源获取】1. 光学显微镜算法(OMA)1.1 物镜放大倍数1.2 目镜放大倍数 2. 改进后的IOMA算法2.1 透镜成像折射方向学习 3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【获取资源请见文章第5节:…...
第三课-软件升级-Stable Diffusion教程
前言: 虽然第二课已经安装好了 SD,但你可能在其它地方课程中,会发现很多人用的和你的界面差距很大。这篇文章会讲一些容易忽略或者常常需要做的操作,不一定要完全照做,以后再回过头看看也可以。 1.控制类型 问题:为什么别人有“控制类型”部分,而我没有?如下红色方框…...
【C++】设计模式之——建造者
建造者模式概念模拟实现建造者模式代码实现 建造者模式 首先先大体了解一下,建造者模式是什么意思,它是怎么实现的? 首先,建造者模式是一种创建型设计模式再一个它是使用多个简单的对象一步一步的搭建出一个复杂的对象它可以将一个…...
【C++】基础语句(学习笔记)
一、分支 1、三种基本结构 顺序结构分支结构循环结构 2、if与switch对比 1)使用场景 switch只支持常量值固定相等的分支判断if可以判断区间范围用switch能做的,用if都能做 2)性能比较 分支少时,差别不是很大。分支多时&…...
大厂秋招真题【DP】米哈游20230924秋招T2-米小游与魔法少女-奇运
米哈游20230924秋招T2-米小游与魔法少女-奇运 题目描述与示例 题目描述 米小游都快保底了还没抽到希儿,好生气哦!只能打会活动再拿点水晶。 米小游和世界第一可爱的魔法少女 TeRiRi 正在打 BOSS,BOSS 的血量为h,当 BOSS 血量小…...
LVS+Keepalived 高可用集群负载均衡
一.keepalived介绍 1.1.Keepalived实现原理 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务。 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态。 若当前在线的路由器失效,则其他路由器会根据设置…...
Qt QList类和QLinkedList类 详解
一、QList 类 对于不同的数据类型,QList<T>采取不同的存储策略,存储策略如下: 如果T 是一个指针类型或指针大小的基本类型(该基本类型占有的字节数和指针类型占有的字节数相同),QList<T>将数值直接存储在它的数组当…...
Mac安装GYM遇到的一些坑
以下是遇到的一些问题 安装GitHub上说的直接 pip install gym成功了,但是运行实例报错没安装gym[classic_control],所以就全安装一下[all] 安装GitHub上说的直接 pip install gym成功了,但是运行实例报错没安装gym[classic_control]ÿ…...
【高级rabbitmq】
文章目录 1. 消息丢失问题1.1 发送者消息丢失1.2 MQ消息丢失1.3 消费者消息丢失1.3.1 消费失败重试机制 总结 2. 死信交换机2.1 TTL 3. 惰性队列3.1 总结: 4. MQ集群 消息队列在使用过程中,面临着很多实际问题需要思考: 1. 消息丢失问题 1.1…...
数百个下载能够传播 Rootkit 的恶意 NPM 软件包
供应链安全公司 ReversingLabs 警告称,最近观察到的一次恶意活动依靠拼写错误来诱骗用户下载恶意 NPM 软件包,该软件包会通过 rootkit 感染他们的系统。 该恶意软件包名为“node-hide-console-windows”,旨在模仿 NPM 存储库上合法的“node-…...
SpringBoot的error用全局异常去处理
记录一下使用SpringBoot2.0.5的error用全局异常去处理 在使用springboot时,当访问的http地址或者说是请求地址输错后,会返回一个页面,如下: 这是因为请求的地址不存在,默认会显示error页面 但我们实际需要一个接口&a…...
MyBatisPlus(十一)包含查询:in
说明 包含查询,对应SQL语句中的 in 语句,查询参数包含在入参列表之内的数据。 in Testvoid inNonEmptyList() {// 非空列表,作为参数List<Integer> ages Stream.of(18, 20, 22).collect(Collectors.toList());in(ages);}Testvoid in…...
Linux命令定位与查找:which、whereis和find的用法详解
文章目录 Linux命令的定位与查找1. 简介Linux路径环境变量命令行和Shell 2. which命令which命令的作用使用which命令定位可执行文件多个可执行文件的定位which命令的选项及其使用 3. whereis命令whereis命令的作用使用whereis命令查找二进制文件查找源代码文件whereis命令的选项…...
LeetCode 面试题 17.10. Find Majority Element LCCI【摩尔投票法】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
多校联测11 模板题
题目大意 给你四个整数 n , m , s e e d , w n,m,seed,w n,m,seed,w,其中 n , m n,m n,m为两个多项式 A ( x ) ∑ i 0 n a i x i A(x)\sum\limits_{i0}^na_ix^i A(x)i0∑naixi和 B ( x ) ∑ i 0 m b i x i B(x)\sum\limits_{i0}^mb_ix^i B(x)i0∑mbixi…...
Linux SSH连接远程服务器(免密登录、scp和sftp传输文件)
1 SSH简介 SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录和文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全…...
音乐网站的音乐怎么做/教育机构网站
IO编程 1.什么是IO? 回答: IO在计算机中指input/output,就是输入和输出。 2.什么需要用到IO? 回答: 我们知道程序和运行时数据是在内存中驻留,由cpu这个超快的计算核心来运行,涉及到数据交换的地方,通常是…...
江油网站制作/百度指数搜索指数的数据来源
相信大家也能感受到,其实用多线程是很麻烦的,包括线程的创建、销毁和调度等等,而且我们平时工作时好像也并没有这样来 new 一个线程,其实是因为很多框架的底层都用到了线程池。线程池是帮助我们管理线程的工具,它维护了…...
网站建设误期违约金赔偿限额/南阳本地网络推广优化公司
springboot run 的总体流程如下: (1)加载各种配置文件以及环境参数 主要根据main方法和自动配置文件META-INF/spring.factories 中的相关配置类进行自动化化加载初始化等操作。 注册监事件听器。 初始化容器上下文Context。 解析Compone…...
做慕斯蛋糕那个网站有视频/北京互联网公司
动态变量和静态变量的区别: 1、存储位置动态变量:存储在内存出栈数据区静态变量:存储在全局数据区(静态数据区) 2、生命期动态变量:根据你定义的位置确定,比如你在一个函数中定义的,…...
网站页面设计布局/免费的网站推广在线推广
默认的情况下,只有 Assert 和 Error 会被显示为红色,其它均为白色,这样很不利于辨别日志的类型。因此需要修改不同类别的日志的颜色。 默认的日志风格有两种:Default 和 Darcula,分别对应 “白色主题” 和 “黑色主题…...
iis的网站默认端口/公司网站建设
办公室计算机一直使用Windows 7 企业版,近期重新安装了操作系统,换成了Windows 10专业工作站版,但选择的安装文件有问题(版本号:1709,16299.98),不支持系统管理的共享(无…...