【重拾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…

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

360测试开发技术面试题目

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

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;消除浪费、看板、快换工装等都是精益提高的工具方针。 然而&…

Spark任务优化分析

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

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

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

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

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

C++泛型编程--模版

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

信息系统项目管理师第四版学习笔记——项目绩效域

干系人绩效域 干系人绩效域涉及与干系人相关的活动和职能。在项目整个生命周期过程中&#xff0c;有效执行本绩效域可以实现的预期目标主要包含&#xff1a;①与干系人建立高效的工作关系&#xff1b;②干系人认同项目目标&#xff1b;③支持项目的干系人提高了满意度&#xf…

基于SpringBoot的健身房管理系统

目录 前言 一、技术栈 二、系统功能介绍 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步…

【设计模式】八、桥接模式

文章目录 举例问题分析基本介绍桥接模式在 JDBC 的源码剖析桥接模式的注意事项和细节JDBC 举例 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c; 传统方法对应的类图&#xff1a; 问题分析 扩展性问题(类爆炸)&#xff…

TCP/IP(五)TCP的连接管理(二)三次握手细节

一 ISN序列号探究 本文主要探究三次握手建立TCP连接的细节备注&#xff1a; 某些问题探究的比较深入,当前用不到,暂时通过链接引入进来吃水不忘挖井人&#xff1a; 小林 coding ① 初始序列号 ISN 是如何随机产生的 ISN: 初始化序列号 Initial Sequence Number 接收方和…

scsi READ CAPACITY (10)命令总结

READ CAPACITY (10)概述&#xff1a; READ CAPACITY(10)命令(参见表119)请求设备服务器将描述直接访问块设备的容量和介质格式的8字节参数数据传输到数据缓存中。这个命令可以被处理&#xff0c;就好像它有一个HEAD OF QUEUE任务属性。 如果逻辑单元支持保护信息&#xff0c;应…

渗透测试KAILI系统的安装环境(第八课)

KAILI系统的安装环境(第八课) Kaili是一款基于PHP7的高性能微服务框架&#xff0c;其核心思想是面向服务的架构&#xff08;SOA&#xff09;&#xff0c;支持http、websocket、tcp等多种通信协议&#xff0c;同时还提供了RPC、Service Mesh、OAuth2等功能。Kaili框架非常适合构…

gradle

Gradle Gradle 介绍 Gradle 官方文档是这样介绍的 Gradle 的&#xff1a; Gradle is an open-source build automationopen in new window tool flexible enough to build almost any type of software. Gradle makes few assumptions about what you’re trying to build or…

相机噪声评估

当拥有一个相机&#xff0c;并且写了一个降噪的算法&#xff0c;想要测试降噪的应用效果。 相机在光线不足的情况下产生噪点的原因主要与以下几个因素有关&#xff1a; 感光元件的工作原理&#xff1a;相机的图像传感器是由数百万甚至数千万的感光元件&#xff08;如CMOS或CC…

怎么把heic改成jpg?方法大全在这里

怎么把heic改成jpg&#xff1f;HEIC是一种现代的图像文件格式。它是由ISO制定的标准&#xff0c;并得到了苹果公司的支持和推广。与JPG等传统图像格式相比&#xff0c;HEIC格式可以提供更好的图像质量&#xff0c;并且占用更少的存储空间。这使得它在手机、平板电脑和其他移动设…