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

news2025/6/23 17:18:28

目录

前言

八、结构体

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'};
  
  // 声明一个指向结构体的指针,并指向 myVar
  struct MyStruct *ptr = &myVar;
  
  // 使用指针访问结构体成员变量
  printf("num: %d\n", ptr->num);         // 输出:num: 10
  printf("letter: %c\n", ptr->letter);   // 输出:letter: A
  
  return 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.coloradmin.cn/o/1086260.html

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

相关文章

如何才能找到合适的法语交传翻译服务呢?

法语交传&#xff0c;无需其他语言介入&#xff0c;直接在口译者与听众之间进行即时翻译&#xff0c;这是一种高级口译服务。法语交传在国际会议、商务谈判、法律诉讼等各种场合中发挥着至关重要的作用。那么&#xff0c;如何才能找到合适的法语交传翻译服务呢&#xff1f;法语…

2023年全球新能源动力电池盒市场发展规模及趋势分析:动力电池盒向底盘一体化方向发展[图]

中国新能源汽车市场维持高速增长的态势&#xff0c;电池盒作为在新能源汽车中用以承载、固定、保护以及集成电池组的机构部件&#xff0c;是构成新能源汽车完整动力系统的关键组成部分。2022年&#xff0c;全球新能源动力电池盒市场规模约430亿元&#xff0c;同比增长65.38%&am…

迅镭激光切割机在钣金加工行业中的应用

钣金是一种针对金属薄板(厚度通常在6mm以下)的归纳冷加工工艺&#xff0c;包括剪切、冲切、切割、复合、弯曲、焊接、铆接、拼接和成型等步骤&#xff0c;其显著特征是所有零件的厚度保持一致。 电器控制箱和机器外壳等通常都是钣金件&#xff0c;钣金加工能力的需求持续攀升&a…

JavaFx学习问题2--音频、视频播放失败情况

文章目录 一、路径注意事项&#xff1a;① 用相对路径的时候别忘了前面的斜杠② uri问题 二、播放不了的问题① 获取的媒体文件路径本身就是不对的② 必须是uri 额外收获: 一、路径注意事项&#xff1a; ① 用相对路径的时候别忘了前面的斜杠 并不是什么大问题&#xff0c;只是…

JavaScript-Vue基础语法-创建-组件-路由

文章目录 1.创建vue项目1.1.自定义创建项目1.2.项目结构解析1.3.主要文件1.4.其它 2.项目运行3.Vue组件概念3.1.组件基础概念3.2.单文件组件三要素3.3.组件注册3.4.组件通信 4.Vue路由概念4.1.简单使用4.2.路由参数4.3.嵌套路由4.4.路由导航4.5.代码导航4.6.路由守卫 5.总结 HT…

【Java 进阶篇】JavaScript `typeof` 操作符详解

JavaScript是一种弱类型语言&#xff0c;这意味着变量的数据类型通常是灵活的。为了更好地理解和操作数据&#xff0c;JavaScript提供了typeof操作符&#xff0c;它可以用来确定一个值的数据类型。在本篇博客中&#xff0c;我们将详细讨论typeof操作符&#xff0c;包括它的用法…

访问网站被拦截提示“该网站可能包含违法或违规内容”访问不了怎么办?设置一下360安全卫士即可解决

本来是一个正常的网站&#xff0c;结果被恶意举报后访问提示 该网站可能包含违法或违规内容 根据相关部门规定或投诉举报&#xff0c;此链接可能存在违反相关法律法规或政策的内容&#xff0c;建议您谨慎访问。 您访问的网址是&#xff1a;https://www.shuzhiqiang.com

Mongodb----部署副本集 实现读写分离

使用软件&#xff1a; xshell7 vmware16 centos8 nosql booster 1 部署副本集 推荐方案&#xff1a; 为了降低资源分配&#xff0c;这里仅使用一台服务器&#xff0c;但是分配3个端口&#xff08;27017、27018、27019&#xff09;来分别实现 主节点、副本节点…

echarts双y轴存在负数情况两轴0刻度不对齐问题

例一&#xff1a; <div id"main" style"width: 700px;height:600px;"></div> <script src"https://cdn.bootcss.com/echarts/4.7.0/echarts.min.js"></script> <script>const myChart echarts.init(document.ge…

自定义类型:结构体,枚举,联合 (1)

1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag { member-list; }variable-list; 例如描述一个学生&#xff1a; struct是结构体关键字&#xff0c;不能省略。 …

MES管理系统如何解决电子企业排产难度大的问题

随着消费者需求的多样化和个性化&#xff0c;电子产品定制化程度越来越高&#xff0c;款式多样且需要小批量生产。这种情况下&#xff0c;企业面临着计划排产难度大、资源协调困难等问题。为了解决这些问题&#xff0c;越来越多的企业开始引入MES管理系统&#xff0c;本文将从M…

NVIDIA偷偷换接口,显卡终于不“烧”了

去年10月 NVIDIA RTX 4090 正式发布&#xff0c;可上市没多久便频频「翻车」。 接口熔化、自燃&#xff0c;有意无意间问题指向了供电能力本应更强的 12VHPWR 新接口。 后续大伙应该还记得&#xff0c;玩家安装不规范导致的咯。 然而后续是&#xff0c;即便确保接口插到底、无…

微信个人号如何实现自动回复客户消息?

企业在进行运营媒体平台与来自各个渠道的用户打交道时&#xff0c;像微博和公众号可以通过设置关注语/自动欢迎语来与用户互动。微信也提供了类似的功能&#xff0c;可以通过微信管理系统的自动回复功能实现。 微信管理系统的自动回复功能分为两种&#xff1a;通过好友自动回复…

UTF-16编码原理讲解

文章目录 一、unicode二、什么是UTF-16三、编码规则一个码元两个码元 四、问题大端序小端序&#xff1f; 参考 一、unicode unicode是一个字符集&#xff0c;也称为unicode编码&#xff0c;为每一个字符分配了一个ID&#xff0c;这个ID称为码点 Unicode的编码空间从U0000到U1…

Win11磁盘分区后在恢复之前分区的方法介绍

电脑磁盘分区对于新购买的电脑来说&#xff0c;是整理电脑第一步要做的事情&#xff0c;大家一般都会根据自己的需要把磁盘划分为C盘、D盘、E盘等等方面文件的管理&#xff0c;今天小编给大家介绍一下Win11操作系统下&#xff0c;如何进行分区&#xff0c;如何恢复之前的分区&a…

容器部署的openstack进入数据库流程、查看install目录流程、容器部署使用virsh命令流程【查看计算节点上的虚拟机信息】

说明 何为容器部署&#xff0c;无需多说吧&#xff1f; 如下 计算节点的容器 进入数据库方法【控制节点】 获取nova密码 首先获取nova数据库的密码 控制节点执行&#xff1a;grep mysql /etc/kolla/nova-api/nova.conf 【目录不是固定的&#xff0c;可以通过find命令查找n…

Apache Ant的安装

介绍 Apache Ant是一个Java库和一个 命令行工具&#xff0c;可以用来构建Java应用。Ant提供了许多内置的任务&#xff08;tasks&#xff09;&#xff0c;可以编译、组装、测试、运行Java应用。Ant也可以构建非Java应用&#xff0c;例如C、C应用。 Ant非常灵活&#xff0c;没有…

VBA入门2——程序结构

VBA基础入门2 VBA 程序结构VBA 程序结构入门&#xff08;认识 VBA 程序骨架&#xff09;循环结构判断结构 VBA 变量的声明和赋值&#xff08;使程序动起来&#xff09;不同变量类型声明语句如何声明多个变量声明变量是必须的嘛&#xff1f;变量赋值 VBA 程序顺序结构&#xff0…

python实现图像的直方图均衡化

直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分配图像中的像素值&#xff0c;使得图像的像素值分布更加均匀&#xff0c;增强图像的对比度&#xff0c;从而改善图像的视觉效果。 直方图均衡化的过程如下&#xff1a; 灰度转换&#xff1a;如果图像是彩色…

Vue3路由引入报错解决:无法找到模块“xxx.vue”的声明文件 xxx隐式拥有 “any“ 类型。

这类情况应该遇见过吧&#xff0c;这是因为 TypeScript只能理解 .ts 文件&#xff0c;无法理解 .vue 文件。 解决方法&#xff1a;在项目的根目录或者src文件夹下创建一个后辍为 文件名.d.ts 的文件&#xff0c;并写入一下内容&#xff1a; declare module *.vue {import { …