利用结构类型实现简单通讯录

复合数据类型之结构类型

在C语言中,结构类型是一种复合数据类型,它允许用户将不同类型的数据组合成一个单一的数据结构。结构类型为用户提供了自定义数据类型的机制,使得可以将多个相关的数据项组合成一个整体,常用来处理像记录、链表这样的静态和动态数据结构,从而便于管理和操作。

 

一、结构类型的定义

 

结构类型的定义使用"struct"关键字,后面跟随结构体的名称和一对大括号。在大括号中,可以定义结构体的成员变量,每个成员变量可以具有不同的数据类型。例如:

struct Student {

char name[50];

int age;

float score;

};

 

在上面的示例中,定义了一个名为"Student"的结构体,它包含三个成员变量:"name"(一个字符数组,用于存储学生的姓名)、"age"(一个整型变量,用于存储学生的年龄)和"score"(一个浮点型变量,用于存储学生的成绩)。

 

要创建结构体的实例(即变量),可以使用以下语法:

struct Student stu1;

 

这将创建一个名为"stu1"的"Student"结构体实例。然后,可以通过点运算符(".")或者

("->")来访问结构体中的成员变量(注意:①"."适合于用结构变量或结构数组元素访问其成员②"->"适合于用结构数组或结构指针访问其成员),例如:

strcpy(stu1.name, "张三");

stu1.age = 18;

stu1.score = 90.5;

 

上述代码将"stu1"的"name"成员设置为"张三","age"成员设置为18,"score"成员设置为90.5。

 

二、结构指针的定义

 

除了定义结构类型外,还可以定义结构体类型的指针,并通过指针来访问结构体的成员。例如:

struct Student *stu_ptr;

stu_ptr = &stu1;

printf("%s的年龄是%d岁,成绩是%.1f分\n", stu_ptr->name, stu_ptr->age, stu_ptr->score);

 

上述代码首先定义了一个指向"Student"结构体的指针"stu_ptr",然后将"stu1"的地址赋给"stu_ptr"。接下来,使用"->"运算符来通过指针访问结构体的成员,并打印出学生的姓名、年龄和成绩。

 

三、嵌套结构

 

在C语言中,结构类型可以嵌套使用,也就是说,一个结构体的成员可以是另一个结构体类型。这种嵌套结构允许我们创建更复杂的数据结构,以表示现实世界中的复杂对象或系统。例如:

#include <stdio.h>

// 定义一个表示地址的结构体

struct Address {

char street[50];

char city[50];

char country[50];

};

 

// 定义一个表示学生的结构体,其中包含一个地址结构体成员

struct Student {

char name[50];

int age;

float score;

struct Address addr; // 嵌套的地址结构体

};

 

在这个例子中,"struct Address" 是一个表示地址的结构体,它包含了街道、城市和国家等字段。然后,"struct Student" 是一个表示学生的结构体,它包含了姓名、年龄、成绩以及一个 "struct Address"类型的成员 "addr"。

 

嵌套结构允许我们构建更加复杂的数据结构,这在处理现实世界中的复杂对象时非常有用。例如,一个公司可能有一个员工结构体,而每个员工都有一个地址结构体作为其成员。这样,我们可以方便地管理和访问员工的所有相关信息。

 

四、结构类型的赋值

 

当要为结构体的实例赋值时,可以直接给每个成员赋值,或者使用结构体初始化列表来一次性初始化所有成员。例如:

c35dfeb37fac43d8acf7b091014a68fb.png

 五、结构数据在函数间的传递

在C语言中,结构数据可以通过多种方式在函数间传递。下面是一些常见的方法:

 

(1)值传递

 

当将结构体作为参数传递给函数时,默认情况下是通过值传递的,这意味着函数会接收结构体的一个副本,对副本所做的修改不会影响原始结构体。例如:

#include <stdio.h>

struct Point {

int x;

int y;

};

 

void printPoint(struct Point p) {

printf("(%d, %d)\n", p.x, p.y);

}

 

int main() {

struct Point p = {10, 20};

printPoint(p); // 输出: (10, 20)

return 0;

}

 

 

(2) 指针传递

 

如果想要修改原始结构体或避免结构体的复制开销,可以使用指针传递。这样,函数将接收结构体的地址,可以直接操作原始数据。例如:

#include <stdio.h>

struct Point {

int x;

int y;

};

 

void movePoint(struct Point *p, int dx, int dy) {

p->x += dx;

p->y += dy;

}

 

int main() {

struct Point p = {10, 20};

movePoint(&p, 5, 10); // 移动点

printf("(%d, %d)\n", p.x, p.y); // 输出: (15, 30)

return 0;

}

 

(3)返回结构体

 

函数也可以返回结构体。当函数返回结构体时,实际上返回的是结构体的一个副本。

#include <stdio.h>

struct Point {

int x;

int y;

};

struct Point addPoints(struct Point p1, struct Point p2) {

struct Point result;

result.x = p1.x + p2.x;

result.y = p1.y + p2.y;

return result;

}

 

int main() {

struct Point p1 = {10, 20};

struct Point p2 = {30, 40};

struct Point p3 = addPoints(p1, p2);

printf("(%d, %d)\n", p3.x, p3.y); // 输出: (40, 60)

return 0;

}

 

(4) 使用全局变量

 

结构体也可以作为全局变量,这样它们可以在多个函数之间共享。但这种方法通常不推荐,因为它会破坏封装性并可能导致难以追踪的副作用。

 

(5)动态内存分配

 

对于大型结构体或需要多次修改的结构体,可以考虑使用动态内存分配(如"malloc"和"free"函数)。这样,你可以在堆上分配内存,并通过指针在函数间传递这些内存块。

 

选择哪种方法取决于你的具体需求。在大多数情况下,指针传递是最高效和最灵活的方式,因为它避免了不必要的数据复制,并允许函数直接操作原始数据。然而,这也增加了编程的复杂性,因为需要正确地管理指针和内存。

 

下面我们利用上述知识实现简单通讯录:

9f57925264114e2086a5a569e467eb70.png

 

我们利用Input()用来输入通讯录的数据,

display()用来输出通讯录的数据,main()函数向input()和 Display()函数传递结构数,用于函数的数据传递。

程序中main()函数调用Input()函数时,形参和实参都是结构数组名,此时,形参将 自动转换成结构指针;main()函数调用Display()函数时,实参是结构数组名,形参是结构指针,两次调用的传递机制是相同的。

同样的,我们还可以实现简单的成绩统计:

用score数组存3门课成绩,并将score作为结构的一个成员被传递,此时用作计算总分的函数add()只要用指针接收score的首地址即可。

717612d664a143c7854b246491a6104a.png

 

 

结构类型在C语言中非常有用,它可以用于表示复杂的数据结构,例如记录、链表等。通过定义结构类型,可以方便地组织和操作多个相关的数据项,提高代码的可读性和可维护性。

好啦,今天的分享就到这里了。再次声明:作者水平有限,如有失偏颇,还请各位不吝赐教!

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

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

相关文章

验证二叉搜索树(98)

解题思路&#xff1a;可以直接中序遍历放进一个数组里根据特性判断是否是递增就可以&#xff0c;如果采用递归的思路话用中序遍历和创建一个指针指向前一个节点&#xff0c;根据前一个节点是否比上一个节点小来判断是否是二叉树 具体代码如下&#xff1a; class Solution { …

华为P系列“砍了”,三角美学系列全新登场

2021 年 10 月&#xff0c;Intel 正式带来了颠覆以往的第 12 代酷睿「混合架构」 CPU。 不知道是良心发现还是为了弥补 11 代酷睿过于拉胯表现&#xff0c;Intel 终于把狠活儿都用在了这代。 全新 Intel 7 工艺、全新架构、单核与多核性能大幅提升&#xff0c;让大家十分默契…

【Linux高性能服务器编程】——高性能服务器框架

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之高性能服务器框架介绍&#xff0c;在这篇文章中&#xff0c;你将会学习到高效的创建自己的高性能服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解&…

Win 进入桌面黑屏,只有鼠标

大家好&#xff0c;我叫秋意零。 今天&#xff0c;遇到一个同事电脑进入桌面黑屏&#xff0c;只有鼠标。经过询问沟通&#xff0c;说是 Windows 突然进行了自动更新&#xff0c;更新之后桌面就黑了屏。经过查询是一个桌面进程没启动才会导致桌面黑屏。首先分两种情况&#xff0…

代码随想录算法训练营DAY30|C++回溯算法Part.6|332.重新安排行程、51.N皇后、31.解数独

文章目录 332.重新安排行程思路死循环的问题记录映射关系解决死循环并解决字母序问题 伪代码实现CPP代码 51.N皇后思路伪代码实现CPP代码 31.解数独伪代码实现CPP代码 332.重新安排行程 力扣题目链接 文章讲解&#xff1a;332.重新安排行程 状态&#xff1a;题目要求所有机票都…

工业级3D可视化工具HOOPS Visualize, 快速构建移动端和PC端工程应用程序!

HOOPS Visualize是一款强大的工业级3D渲染引擎&#xff0c;帮助您打造出众的工程应用程序。HOOPS Visualize的基石是图形内核&#xff0c;这是一种全功能的&#xff0c;以工程为重点的场景图技术&#xff0c;我们称为Core Graphics。Core Graphics集成到一个框架中&#xff0c;…

大模型改变了NLP的游戏规则了吗

NLP已经死了吗&#xff1f; 自从 ChatGPT 横空出世以来&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09; 研究领域就出现了一种消极的声音&#xff0c;认为大模型技术导致 NLP “死了”。在某乎上就有一条热门问答&#xff0c;大…

Docker 部署网页版 vscode (code-server)

什么是 code-server code-server 是一个基于 Visual Studio Code 的开源项目&#xff0c;它允许你通过 Web 浏览器来使用 Visual Studio Code 的编辑功能。这意味着你可以在任何设备上&#xff0c;只要有浏览器和网络连接&#xff0c;就可以访问和使用 Visual Studio Code&…

漫谈HAMR硬盘的可靠性-2

很显然&#xff0c;HAMR已经成为业内用于提升HDD硬盘容量硬盘的技术手段。三家机械硬盘HDD厂商&#xff0c;希捷、西数、东芝都已对HAMR硬盘进行了十多年的研究&#xff0c;但只有希捷大胆押注HAMR。相反&#xff0c;东芝和西部数据在采用HAMR之前选择了能量辅助垂直磁记录&…

Axure中的样式

样式 首先说一下Axure里面的原点位置 如下图&#xff1a; 还有一个办法是我们选中我们的按钮&#xff0c;如上图&#xff0c;然后打开右边的样式&#xff0c;可以看按钮的x&#xff0c;y属性&#xff0c;类似于游戏中unity软件的x&#xff0c;y属性&#xff0c;类似于html中…

程序设计语言—Python几种语言区别的总结

程序设计语言篇—Python&几种语言区别的总结 文章目录 程序设计语言篇—Python&几种语言区别的总结一、Python介绍&理解1.1 Python基础1.2 Python规范 二、标识符&变量&常量三、数据类型&运算符和表达式3.1 数据类型3.2 运算符&表达式 四、常用的函…

Linux 系统IO函数之stat、lstat函数

1、stat函数 要点&#xff1a; int stat(const char *pathname, struct stat *statbuf); 作用&#xff1a;查看文件的信息 man 2 stat/return value1、stat结构体&#xff1a; 2、sturct stat 结构体中 st_mode 的含义&#xff08;文件的类型和存取的权限&#xff09;: st_mo…

华媒舍:百度竞价排名如何提升点击率

在网络推广中&#xff0c;提升点击率是十分重要的。运用百度搜索引擎广告是一种常用的提升点击率的形式。而百度竞价推广是搜索引擎所提供的一种付费流量方法&#xff0c;根据提高网站在搜索结果中的排名&#xff0c;可以有效提升点击率。下面我们就详细介绍如何运用百度竞价推…

每日OJ题_其它背包问题①_力扣474. 一和零(二维费用01背包)

目录 力扣474. 一和零 解析代码 代码优化 力扣474. 一和零 474. 一和零 难度 中等 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&…

【Linux】权限(shell运行原理、概念,Linux权限)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 shell命令以及运行原理 创建和删除用户 创建新普通用户 删除用户 Linux权…

Unity中的UI系统之UGUI

目录 概述UGUI基础——六大基础组件六大基础组件概述Canvas画布组件CanvasScaler画布缩放控制器组件必备知识恒定像素模式缩放模式恒定物理模式3D模式 Graphic Raycaster图形射线投射器EventSystem和Standalone Input ModuleRectTransform UGUI基础——三大基础控件Image图像控…

混淆原理与实践指南

引言 &#x1f680; 在当今的软件开发领域&#xff0c;保护代码的安全性和保密性变得越来越重要。混淆&#xff08;Obfuscation&#xff09;技术作为一种保护代码的手段&#xff0c;在应对逆向工程和代码盗用方面发挥着关键作用。本文将深入探讨混淆的原理&#xff0c;以及如何…

javaWeb项目-财务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Springboot框架 …

[lesson45]不同的继承方式

不同的继承方式 不同的继承方式 C中支持三种不同的继承方式 public继承 父类成员在子类中保持原有的访问级别 private继承 父类成员在子类中变为私有成员 protected继承 父类中公有成员变为保护成员&#xff0c;其他成员保持不变 遗憾的事实 一般而言&#xff0c;C工程项目…

镭眸T52激光雷达:无人叉车定位及避障新选择

在传统物料搬运领域&#xff0c;叉车虽扮演了重要角色&#xff0c;但人工操作的局限性——高昂的人力成本、有限的操作效率以及潜在的安全隐患&#xff0c;一直是企业面临的难题。随着劳动力成本的不断攀升&#xff0c;企业对降低成本、提升效率、减少安全事故的需求愈发迫切。…