【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的结构体类型,包含了四个数据成员:idnameagescore,分别为整型、字符数组型、整型和浮点型。该结构体类型可以用于定义表示学生的对象,每个对象包括了学生的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;否则输出错误提示信息。最后,我们输出投票结果,显示每个候选人的名字和票数。

 

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

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

相关文章

前端el-select 单选和多选

el-select单选 <el-form-item label"部门名称" prop"departId"><el-select v-model"dataForm.departId" placeholder"请选择" clearable:style{ "width": "100%" } :multiple"false" filtera…

接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)

近期准备优先做接口测试的覆盖&#xff0c;为此需要开发一个测试框架&#xff0c;经过思考&#xff0c;这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的&#xff0c;测试人员会希望很快能得到结果反馈&#xff0c;然而接口的数量一般都很多&#xff0c;而且会越来越…

【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】

文章目录 1.1 什么是 CI-700?1.1.1 关于 CI-7001.1.2 CI-700 特点1.2 全局配置参数1.2.1 寻址能力1.3 组件和配置1.3.1 CI-700 互联的结构1.3.2 Crosspoint(XP)1.3.3 外部接口1.4 组件(Components)1.1 什么是 CI-700? CI-700是一种AMBA 5 CHI互连,具有可定制的网状拓扑结构…

<HarmonyOS第一课>ArkTS开发语言介绍——闯关习题及答案

判断题 1.循环渲染ForEach可以从数据源中迭代获取数据&#xff0c;并为每个数组项创建相应的组件。&#xff08; 对 &#xff09; 2.Link变量不能在组件内部进行初始化。&#xff08; 对 &#xff09; 单选题 1.用哪一种装饰器修饰的struct表示该结构体具有组件化能力&#…

Maven 下载安装配置

Maven 下载安装配置 下载 maven maven 官网&#xff1a;https://maven.apache.org/ maven 下载页面&#xff1a;https://maven.apache.org/download.cgi 安装 maven 将下载的apache-maven.zip文件解压到安装目录 将加压后的apache-maven目录改名为maven maven 配置环…

Kafka 高可用

正文 一、高可用的由来 1.1 为何需要Replication 在Kafka在0.8以前的版本中&#xff0c;是没有Replication的&#xff0c;一旦某一个Broker宕机&#xff0c;则其上所有的Partition数据都不可被消费&#xff0c;这与Kafka数据持久性及Delivery Guarantee的设计目标相悖。同时Pr…

threejs 透明贴图,模型透明,白边

问题 使用Threejs加载模型时&#xff0c;模型出现了上面的问题。模型边缘部分白边&#xff0c;或者模型出现透明问题。 原因 出现这种问题是模型制作时使用了透明贴图。threejs无法直接处理贴图。 解决 场景一 模型有多个贴图时&#xff08;一个透贴和其他贴图&#xff0…

笔记01:随机过程——随机游动

一、伯努利随机过程 1. n次伯努利实验中&#xff08;x1&#xff09;发生的总次数Yn&#xff1a; (二项分布) 2. 伯努利实验中事件第一次发生的时间L1&#xff1a; &#xff08;几何分布&#xff09; 3. n次伯努利实验中事件第k次发生的时间Lk&#xff1a; &#xff08;帕斯卡分…

list的模拟实现

全部代码 #pragma once namespace HQJ {template<class T>struct __list_node//节点类{T __data;__list_node<T>* __prev;__list_node<T>* __next;__list_node(const T& x T())//由于不知道要存储的数据类型&#xff0c;使用匿名对象进行初始化:__data…

HiveServer2 Service Crashes(hiveServer2 服务崩溃)

Troubleshooting Hive | 5.9.x | Cloudera Documentation 原因&#xff1a;别人用的都好好的&#xff0c;我的集群为什么会崩溃&#xff1f; 1.hive分区表太多(这里没有说具体数量。) 2.并发连接太多&#xff0c;我记的以前默认是200个连接 3.复杂的hive查询访问表的的分区…

(一)实现一个简易版IoC容器【手撸Spring】

一、前言 相信大家在看本篇文章的时候&#xff0c;对IoC应该有一个比较清晰的理解&#xff0c;我在这里再重新描述下&#xff1a;它的作用就是实现一个容器将一个个的Bean&#xff08;这里的Bean可以是一个Java的业务对象&#xff0c;也可以是一个配置对象&#xff09;统一管理…

JetPack系列:001-JetPack概要介绍

文章目录 1. 概念介绍2. 主要内容2.1 框架库2.2 UI界面库 3. 核心思想4. 内容总结 本章回是一起Talk AndroidJetpack吧专栏的第一章回&#xff0c;本章回中主要介绍JetPack的基本概念和编程思想&#xff0c;同时也会介绍它的基础知识。闲话休提&#xff0c;请我们一起Talk Andr…

趣味工具箱小程序源码

趣味工具箱小程序源码&#xff0c;支持功能去水印&#xff0c;精选壁纸&#xff0c;图片压缩&#xff0c;文字生成二维码&#xff0c;图片加水印&#xff0c;模拟来电&#xff0c;手持弹幕&#xff0c;掷骰子…等 使用小工具&#xff0c;一个小程序有几十个功能。 源码下载&am…

面试打底稿⑥ 项目一的第二部分

简历原文 抽查部分 计算运费模块板块扩展性优化&#xff0c;采用责任链模式&#xff0c;实现不同地区间寄件的运费模板扩展的优化&#xff0c;为模块解耦&#xff0c;提高了系统的扩展性 短信模块设计&#xff0c;设计了短信发送数据模板的数据化存储&#xff0c;规范了发送短…

uniapp微信小程序蓝牙连接与设备数据对接

蓝牙连接并通信方法封装大致步骤。 初始化蓝牙并搜索&#xff1b;获取并启用service服务&#xff1b;数据读取和监听设备返回数据 需要使用uniapp官方提供api&#xff1a; // 关闭蓝牙 uni.closeBluetoothAdapter({}) // 打开蓝牙 uni.openBluetoothAdapter({}) // 搜索附近…

服务器or虚拟机安装SSH和虚拟机or服务器设置远程服务权限

第一步 服务器/虚拟机安装SSH工具,这是外部SSH终端连接服务器/虚拟机的第一步! sudo apt update && sudo apt upgrade#更新apt sudo apt install openssh-server#安装SSH工具 service ssh status#查看SSh运行状态 sudo systemctl enable --now ssh#运行SSH工具第二步…

Pytorch-学习记录-1-Tensor

1. 张量 (Tensor): 数学中指的是多维数组&#xff1b; torch.Tensor data: 被封装的 Tensor dtype: 张量的数据类型 shape: 张量的形状 device: 张量所在的设备&#xff0c;GPU/CPU requires_grad: 指示是否需要计算梯度 grad: data 的梯度 grad_fn: 创建 Tensor 的 Functio…

Google Cloud dataflow streaming job简介

简单介绍 首先 gcp 的dataflow 是1个ETL 组件, 它是基于Apache beam的 Apache beam 是1个较新的开源ETL 框架。 对于我们常用的ETL tool Spring batch 有下面的区别 spring batch 更偏向batch &#xff08;后台处理&#xff09;的ETL&#xff0c; 而apache beam 同时支持bat…

[python 刷题] 3 Longest Substring Without Repeating Characters

[python 刷题] 3 Longest Substring Without Repeating Characters 题目&#xff1a; Given a string s, find the length of the longest substring without repeating characters. 这到提要求找的是最长的&#xff0c;没有重复符号的子字符串 解题思路是用双指针哈希表&…

mysql MVCC(多版本并发控制)理解

最近看MVCC相关资料&#xff0c;这边做一个记录总结&#xff0c;方便后续理解。 目录 一、MVCC相关概念 二、MVCC实现原理 1.隐藏字段 2.undo log 3.Read View 4.MVCC的整体处理流程 5. RC&#xff0c;RR级级别下的innoDB快照读有什么不同 6.总结 一、MVCC相关概念 1…