【重拾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.mzph.cn/news/102322.shtml

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

相关文章

JOSEF约瑟 矿用一般型选择性漏电继电器 LXY2-660 Φ45 JKY1-660

系列型号&#xff1a; JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-12…

uni-app 实现考勤打卡功能

一、在页面中引入地图组件 <map id"map" style"width: 100%; height: 100%" :latitude"myLatitude" :longitude"myLongitude" :circles"circles" :markers"markers"> </map>属性名类型说明longitudeN…

python 实现MA指标

交易中均线是非常常用的指标&#xff0c;有指标终于均线的说法&#xff0c;利用均线指标可以构造更多基于价格的指标。目前广大的交易者多用python打造自已的相关交易工具&#xff0c;下面是我利用python产现的MA指标计算代码&#xff1a; def read_ma(self, stock_dat, *windo…

VRRP 虚拟路由器冗余协议的解析和配置

VRRP的解析 个人简介 原理和HSRP的差不多&#xff0c;少了一些状态就只有了三种状态 还有不同的就是VRRP严格按照抢占要求 一个VRRP组中具有最高优先级的设备成为Master路由器缺省优先级为100若优先级相同&#xff0c;具有最高接口IP地址最大的路由器成为Master路由器抢占(Pr…

Centos指令合集

2023-10-09 防火墙 开启 systemctl start firewalld自启动 systemctl enable firewalld.service关闭 systemctl stop firewalld禁用 systemctl disable firewalld.service查看状态 systemctl status firewalld

【前端】sortable.js Vue 数组数据更新问题 数据跟页面不同步 深度复制

先用一个数据深拷贝数据&#xff0c;这里使用了 slice 方法&#xff0c;然后置空&#xff0c;最后在 $nextTick 中赋值深拷贝出来的数组值。最后可以了。 猜测是vue没有检测到arr改变 解决方案 增加唯一不变的key 有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲…

360测试开发技术面试题目

最近面试了360测试开发的职位&#xff0c;将面试题整理出来分享~ 一、java方面 1、java重载和重写的区别 重载overloading 多个方法、相同的名字&#xff0c;不同的参数 重写overwrite 子类继承父类&#xff0c;对方法进行重写 2、java封装的特性 可以改变内部实现&#xff0c;…

Python与CAD系列基础篇(三)创建二三维多段线、圆弧、椭圆弧、样条曲线

目录 0 简述1 二三维多段线2 圆弧3 椭圆弧4 样条曲线0 简述 本篇详细介绍使用①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件创建和编辑多段线、圆弧、椭圆弧和样条曲线的方法。 1 二三维多段线 pyautocad方式 分别创建二维和三维多段线: from pyautocad …

UnrealEngine iOS 打包 —— 签名证书(cer、p12)生成

官方文档 docs.unrealengine.com/5.3/zh-CN/setting-up-ios-tvos-and-ipados-provisioning-profiles-and-signing-certificates-for-unreal-engine-projects 打开 ProjectSettings -> Platforms -> iOS 可以看到签名证书配置 需要拓展名为 .cer 和 .p12 的一对证书和密钥…

精益生产与MES生产管理系统相互融合

近年来&#xff0c;精益生产理念在企业管理中越来越受欢迎。它强调以最小的浪费&#xff0c;在最短的时间内&#xff0c;生产出高质量的产品。这一理念的实施手段包括准时制生产方式、适时生产方式等&#xff0c;消除浪费、看板、快换工装等都是精益提高的工具方针。 然而&…

新版Microsoft Edge启用IE模式

新版Microsoft Edge采用了和Chrome一样的内核Chromium&#xff0c;青出于蓝而更胜于蓝。与 Chrome相比&#xff0c;能直接登录微软账号进行同步&#xff0c;自带插件商店&#xff08;亦可用Chrome插件&#xff09;&#xff0c;占用比 Chrome低&#xff0c;速度不差。 缺点就是国…

Spark任务优化分析

一、背景 首先需要掌握 Spark DAG、stage、task的相关概念 Spark的job、stage和task的机制论述 - 知乎 task数量和rdd 分区数相关 二、任务慢的原因分析 找到运行时间比较长的stage 再进去看里面的task 可以看到某个task 读取的数据量明显比其他task 较大。 如果是sql 任…

通过modbus与串口屏通讯控制

串口屏作为modbus主机&#xff0c;下位机主板作为从机&#xff0c;在从机中建立一张数据表与串口屏作为数据交换缓冲&#xff0c;从机移植freemodbus协议栈&#xff0c;定时响应串口屏的轮询 如下&#xff0c;在一个项目中建立的数据表 //上报给屏的槽状态 typedef struct _d…

自动售货机销售数据分析与应用

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 摘要&#xff1a; 本案例将主要结合自动售货机的实际情况&#xff0…

APISIX 中ETCD 的问题

1. 问题1 &#xff1a; Error: client: etcd cluster is unavailable or misconfigured; error #0: client: endpoint http://etcd:2379 exceeded header timeout error #0: client: endpoint http://etcd:2379 exceeded header timeout 修改APISIX config ETCD_ADVERTISE_CL…

folium 增加搜索、经纬度弹出,字段弹出的方法

m.add_child(folium.LatLngPopup()) cellgeogpd.read_postgis(‘SELECT “铜陵3G第二批拍照基站”.*,region.name FROM “铜陵3G第二批拍照基站”,(SELECT geom,“name” from “gis_县” where 市‘铜陵市’ and name‘枞阳县’) as region where st_intersects(“铜陵3G第二…

wordpress的lnmp环境一键安装和手工配置

1. 使用oneinstack安装lnmp环境&#xff0c;按照"Recommend PHP 7.4 or greater and MySQL version 5.7 or MariaDB version 10.4 or greater."的wordpress官方建议配置生成安装脚本。配置后在/root/oneinstack/options.conf中可找到安装的相关目录位置和密码等。 2.…

23.10.7.sql 里面的DISTINCT

例如&#xff1a; SELECT DISTINCT t.container_no FROM biz_inventory_task_detail t 这里distinct干嘛的 解释&#xff1a; DISTINCT是一个关键字&#xff0c;用于在SELECT语句中返回唯一不重复的值。 在这个查询中&#xff0c;使用DISTINCT关键字&#xff0c;是为了返回biz…

虹科方案丨自动驾驶多传感器数据融合方法

文章来源&#xff1a;雅名特自动驾驶 点此阅读原文&#xff1a;https://mp.weixin.qq.com/s/QsPMWZDGZaPdEx47L2VmeA 近年来&#xff0c;深度学习技术在涉及高维非结构化数据领域展现出了最先进的性能&#xff0c;如计算机视觉、语音、自然语言处理等方面&#xff0c;并且开始涉…

C++泛型编程--模版

这里写目录标题 模板特点 函数模版语法注意事项二级目录二级目录二级目录二级目录二级目录二级目录二级目录 模板 特点 函数模版 语法 最上面一行是在声明 我要创建模板了 其中T可以替换 但是一般都用T 因为他是template的首字母 之后 进行函数定义与声明 使用背景&#xff…