【重拾C语言】八、表单数据组织——结构体(类型、类型别名、直接/间接访问;典例:复数、成绩单)

目录

前言

八、结构体

8.1 结构体类型

8.2 结构体类型名

8.2.1 typedef关键字

8.2.1 结构体类型别名

8.3 结构体变量

8.3.1 使用结构体类型引用

8.3.2 使用结构体类型定义

8.3.3 使用typedef定义的结构体类型别名

8.4 访问结构体变量

8.4.1 直接成员选择表达式

8.4.2 间接成员选择表达式——指向结构体变量的指针

8.4.3 嵌套结构体

8.5 程序设计实例

8.5.1 复数

8.5.2 成绩


 

 

前言

        C语言中,结构体(Structure)是一种自定义的数据类型,用于组织和存储不同类型的数据项。结构体允许我们将多个相关的数据项组合在一起,形成一个更复杂的数据结构。

 

八、结构体

8.1 结构体类型

  • 结构体类型的定义
    • 结构体类型是分量的集合
    • 分量也称成员、成分、域
    • 分量类型可以不同
  • C语言中,结构体类型的定义是使用struct关键字
    • 结构体标签是用于标识结构体类型的名称。
    • 在定义结构体类型时,可以在结构体内部声明多个成员变量,每个成员变量都有自己的数据类型。
    • 名为Person的结构体类型,包含姓名、年龄和性别三个成员变量:
      • struct Person {char name[50];int age;char gender;
        };
  • 结构体类型的定义通常放在程序的开头或者单独的头文件中,以便在需要使用结构体的地方可以直接引用。

 

8.2 结构体类型名

8.2.1 typedef关键字

        typedef是C语言中的一个关键字,用于为已有的数据类型起一个新的名称(别名)。通过使用typedef,我们可以为现有的数据类型定义一个新的名称,以便在代码中更方便地使用。

  • typedef的语法形式是:
    • typedef 原类型名 别名;
  • 使用typedef来为int类型定义一个新的名称,比如叫做"myInt":
    • typedef int myInt;
  • 使用myInt来声明一个整数变量,就相当于声明一个int类型的变量:
    • myInt num = 42;

 

8.2.1 结构体类型别名

typedef struct Person {char name[50];int age;char gender;
} PersonType;

   typedef关键字用于为struct Person类型定义了一个别名PersonType。现在可以使用PersonType作为结构体类型struct Person的替代名称。

 

8.3 结构体变量

  • 类型定义不分配存储空间,只说明一个数据类型的框架结构
  • 类型标识符只定义了一个数据类型的框架,不占用存储空间,只给相应类型起一个名字
  • 只有变量才具有实体,才能保存数据
  • 声明结构体变量,可以采取如下三种形式之一

8.3.1 使用结构体类型引用

struct Person person1;  // 使用结构体类型引用声明结构体变量
person1.age = 25;
printf("Age: %d\n", person1.age);

        使用`struct`关键字加上结构体类型名称来声明结构体变量`person1`。然后,可以通过该变量访问结构体的成员。

 

8.3.2 使用结构体类型定义

struct Person {char name[50];int age;char gender;
};struct Person person2;  // 使用结构体类型定义声明结构体变量
person2.age = 30;
printf("Age: %d\n", person2.age);

        在声明结构体变量之前先定义了结构体类型`struct Person`,包括其成员。然后,我们可以使用该结构体类型来声明结构体变量`person2`。

 

8.3.3 使用typedef定义的结构体类型别名

typedef struct {char name[50];int age;char gender;
} PersonType;PersonType person3;  // 使用结构体类型别名声明结构体变量
person3.age = 35;
printf("Age: %d\n", person3.age);

        使用`typedef`关键字将匿名结构体类型定义为别名`PersonType`,然后使用`PersonType`来声明结构体变量`person3`。通过使用别名,我们可以直接访问结构体变量的成员。

8.4 访问结构体变量

8.4.1 直接成员选择表达式

        直接成员选择表达式使用点号(.)来访问结构体变量的成员。

 

8.4.2 间接成员选择表达式——指向结构体变量的指针

        通过指针可以方便地访问结构体的成员变量,可以使用箭头运算符 "->" 来访问指向结构体的指针所指向的成员变量。例如,如果有一个指向结构体的指针 ptr,并且结构体中有一个成员变量 member,我们可以使用 ptr->member 来访问该成员变量的值。

#include <stdio.h>// 定义一个结构体
struct MyStruct {int num;char letter;
};int main() {// 声明一个结构体变量并初始化struct MyStruct myVar = {10, 'A'};// 声明一个指向结构体的指针,并指向 myVarstruct MyStruct *ptr = &myVar;// 使用指针访问结构体成员变量printf("num: %d\n", ptr->num);         // 输出:num: 10printf("letter: %c\n", ptr->letter);   // 输出:letter: Areturn 0;
}

 

 

8.4.3 嵌套结构体

        对于嵌套结构体,你仍然可以使用成员选择表达式来访问内层结构体变量的成员。无论是直接成员选择表达式还是间接成员选择表达式,都可以根据需要继续应用于内层结构体变量。

        嵌套结构体:

struct InnerStruct {int innerNum;char innerLetter;
};struct OuterStruct {int outerNum;struct InnerStruct inner;
};

        OuterStruct 包含一个整数类型的成员变量 outerNum 和一个嵌套的 InnerStruct 结构体变量 inner,而 InnerStruct 结构体又包含一个整数类型的成员变量 innerNum 和一个字符类型的成员变量 innerLetter

        如果我们有一个嵌套结构体变量 myOuterVar,我们可以使用成员选择表达式来访问其中的成员变量。例如,要访问 outerNum,我们可以使用 myOuterVar.outerNum。要访问 innerNum,我们可以使用 myOuterVar.inner.innerNum。类似地,要访问 innerLetter,我们可以使用 myOuterVar.inner.innerLetter

#include <stdio.h>struct InnerStruct {int innerNum;char innerLetter;
};struct OuterStruct {int outerNum;struct InnerStruct inner;
};int main() {struct OuterStruct myOuterVar;// 设置外层结构体成员变量的值myOuterVar.outerNum = 10;// 设置内层结构体成员变量的值myOuterVar.inner.innerNum = 20;myOuterVar.inner.innerLetter = 'A';// 输出外层结构体成员变量的值printf("Outer Num: %d\n", myOuterVar.outerNum);// 输出内层结构体成员变量的值printf("Inner Num: %d\n", myOuterVar.inner.innerNum);printf("Inner Letter: %c\n", myOuterVar.inner.innerLetter);return 0;
}

        

49f8f4ad81b64ce68d8ff347d4aa1544.png

        无论嵌套结构体有多深,都可以根据结构体成员的层次结构使用成员选择表达式来访问任意层级的成员变量。

 

8.5 程序设计实例

8.5.1 复数

        复数(Complex number)是由实数部分和虚数部分组成的数。在程序设计中,我们可以使用结构体来表示复数,例如:

struct Complex {double realPart;double imaginaryPart;
};

        定义了一个名为 Complex 的结构体,它包含两个成员变量 realPart  和 imaginaryPart,分别表示复数的实部和虚部。使用这个结构体,我们可以创建复数的变量并对其进行操作:

#include <stdio.h>struct Complex {double realPart;double imaginaryPart;
};int main() {struct Complex myComplex;// 设置复数的实部和虚部myComplex.realPart = 3.0;myComplex.imaginaryPart = 4.0;// 访问并输出复数的实部和虚部printf("Real Part: %.2f\n", myComplex.realPart);printf("Imaginary Part: %.2f\n", myComplex.imaginaryPart);return 0;
}

a42376a6c7fa40749e61524bbd57033a.png

 

8.5.2 成绩

#include <stdio.h>struct Score {char name[50];char subject[50];int score;
};int main() {struct Score score1;printf("请输入姓名:");scanf("%s", score1.name);printf("请输入科目:");scanf("%s", score1.subject);printf("请输入成绩:");scanf("%d", &score1.score);printf("姓名:%s\n", score1.name);printf("科目:%s\n", score1.subject);printf("成绩:%d\n", score1.score);return 0;
}

2bd971cddaac44fdafb706475734b96a.png

 

 

 

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

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

相关文章

leetcode 打家劫舍篇

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

yolov8 strongSORT多目标跟踪工具箱BOXMOT

1 引言 多目标跟踪MOT项目在Github中比较完整有&#xff1a;BOXMOT &#xff0c; 由mikel brostrom提供。在以前的版本中&#xff0c;有yolov5deepsort&#xff08;版本v3-v5&#xff09;&#xff0c; yolov8strongsort&#xff08;版本v6-v9&#xff09;&#xff0c;直至演变…

[Machine learning][Part4] 多维矩阵下的梯度下降线性预测模型的实现

目录 模型初始化信息&#xff1a; 模型实现&#xff1a; 多变量损失函数&#xff1a; 多变量梯度下降实现&#xff1a; 多变量梯度实现&#xff1a; 多变量梯度下降实现&#xff1a; 之前部分实现的梯度下降线性预测模型中的training example只有一个特征属性&#xff1a…

【k8s】ingress-nginx通过header路由到不同后端

K8S中ingress-nginx通过header路由到不同后端 背景 公司使用ingress-nginx作为网关的项目&#xff0c;需要在相同域名、uri&#xff0c;根据header将请求转发到不同的后端中在稳定发布的情况下&#xff0c;ingress-nginx是没有语法直接支持根据header做转发的。但是这个可以利…

Tmux教学【有图有代码】

Tmux教学【有图有代码】 0、前言1、Tmux基本概念1.1 安装 2、Tmux使用2.1 session操作2.2 window操作2.3 pane操作2.4 其他操作 3、日常中Tmux的工作流 0、前言 想必同学们在跑代码时也许会存在这样一个问题&#xff1a; 本地在连接远程服务器跑代码的时候&#xff0c;本地ssh窗…

分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测

分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单…

Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题

Unity编辑器在PC平台下使用Addressable加载打包好的Cube&#xff0c;运行发现能正常显示。 而在切换到Android平台下&#xff0c;使用Addressable时加载AB包&#xff0c;生成Cube对象时&#xff0c;Cube模型呈现粉红色&#xff0c;出现类似材质丢失的问题。如下图所示。 这是…

【机器学习】决策树原理及scikit-learn使用

文章目录 决策树详解ID3 算法C4.5算法CART 算法 scikit-learn使用分类树剪枝参数重要属性和接口 回归树重要参数&#xff0c;属性及接口交叉验证代码示例 一维回归的图像绘制 决策树详解 决策树&#xff08;Decision Tree&#xff09;是一种非参数的有监督学习方法&#xff0c;…

【算法优选】 二分查找专题——贰

文章目录 &#x1f60e;前言&#x1f332;[山脉数组的峰顶索引](https://leetcode.cn/problems/peak-index-in-a-mountain-array/)&#x1f6a9;题目描述&#xff1a;&#x1f6a9;算法思路&#x1f6a9;代码实现&#xff1a; &#x1f334;[寻找峰值](https://leetcode.cn/pro…

VUE3基础知识梳理

VUE3基础知识梳理 一、vue了解和环境搭建1.vue是什么&#xff1a;cn.vuejs.org/vuejs.org2.渐进式框架3.vue的版本4.vueAPI的风格5.准备环境5.1.创建vue项目5.2.vue的目录结构 二、vue3语法1.干净的vue项目2.模板语法2.1 文本插值2.2属性绑定2.3条件渲染2.4列表渲染2.5通过key管…

10、SpringBoot_测试用例

四、测试用例 1.准备工作 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>com…

ELK 处理 SpringCloud 日志

在排查线上异常的过程中&#xff0c;查询日志总是必不可缺的一部分。现今大多采用的微服务架构&#xff0c;日志被分散在不同的机器上&#xff0c;使得日志的查询变得异常困难。工欲善其事&#xff0c;必先利其器。如果此时有一个统一的实时日志分析平台&#xff0c;那可谓是雪…

2023年电工(初级)证考试题库及电工(初级)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年电工&#xff08;初级&#xff09;证考试题库及电工&#xff08;初级&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#…

mysql面试题40:列值为null或者空字符串时,查询是否会用到索引?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:列值为null或者空字符串时,查询是否会用到索引? 当列的值为NULL时,查询可能会使用索引,但具体是否使用索引取决于数据库的优化器和查询条件。…

Compose 编译器版本和Kotlin版本对应关系

使用了最新的kotlin版本&#xff0c;compose报错&#xff0c;不兼容&#xff0c;在这里记录一下版本对应关系 值得注意的是Compose Kotlin 编译器扩展 (androidx.compose.compiler) 未关联到 Compose 库版本。相反&#xff0c;它会关联到 Kotlin 编译器插件的版本&#xff0c;…

【SoC FPGA】HPS启动过程

SoC HPS启动流程 Boot ROMPreloaderBoot Loader HPS的启动是一个多阶段的过程&#xff0c;每一个阶段都会完成对应的工作并且将下一个阶段的执行代码引导起来。每个阶段均负责加载下一个阶段。第一个软件阶段是引导 ROM&#xff0c;引导 ROM 代码查找并且执行称为预加载器的第 …

【ArcGIS】NDVI估算植被覆盖度FVC

NDVI计算 植被覆盖度计算 Step1&#xff1a;调出栅格计算器工具 1、首先打开软件&#xff0c;然后在操作页面点击&#xff0c;自定义工具栏中——自定义模式。 2、再点击窗口中的命令选项。 3、在窗口右上角处搜索“栅格计算”。 4、然后&#xff0c;直接将栅格计算器直接…

Linux C select 的学习

一. select 系统调用 1. 函数说明 #include <sys/select.h> #include <sys/time.h>int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);nfds: 是一个整数值&#xff0c;是指集合中所有文件描述符的范围&#…

SpringBoot 接口 字节数组直接显示为图片

源码&#xff1a; import java.io.ByteArrayOutputStream; import javax.imageio.ImageIO; import org.springframework.web.bind.annotation.RequestMapping;/*** 获取二维码图像* 二维码支付** param price 金额* return 二维码图像* throws IOException IOException*/ Requ…

Windows Nginx 服务器部署(保姆级)

大家好 我是寸铁 不知道怎么部署Windows Nginx 服务器看过来 手把手带你部署服务器 将你的本地网页部署到服务器上 话不多说&#xff0c;直接上操作&#xff01;&#xff01;&#xff01; Windows Nginx服务器部署 进入下载地址&#xff1a; http://nginx.org/en/download.h…