48.【C语言】结构体补充

2024-08-28 02:20
文章标签 语言 补充 结构 48

本文主要是介绍48.【C语言】结构体补充,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

承接20.【C语言】初识结构体(重要)中的结构体成员的访问

目录:

1.结构体创建

2.利用函数控制结构体

3.使用“结构体指针变量-->结构体成员变量”来修改结构体的数据

4.传值还是传址?

1.结构体创建

依据第20篇,可以创建出:

struct S
{int arr[1000];int n;
};int main()
{struct S s = { {1,2,3,4,5},100 };return 0;
}

解读:

定义结构体S中的两个结构体成员,分别为arr整型数组和整型变量n

s为arr和n赋值,arr的前5个元素分别赋值为1,2,3,4,5,其余默认为0,n赋值为100

struct S s:S代表结构布局,s代表结构变量

2.利用函数控制结构体

现创建函数set_Stu来改变结构体S中的数据,创建print_Stu来打印结构体S中的数据

分析一下代码是否能正常完成修改:

#include <stdio.h>
struct S
{int arr[1000];int n;
};void print_Stu(struct S t)
{for (int i = 0; i < 5; i++){printf("%d ", t.arr[i]);}printf("\nn=%d", t.n);
}void set_Stu(struct S t)
{t.n = 150;t.arr[0] = 3;
}int main()
{struct S s = { {1,2,3,4,5},100 };set_Stu(s);print_Stu(s);return 0;
}

答案:显然不行,改变形参(t)不可能改变实参(s)(这是传调用)

应该传址调用

类比函数的定义(29.【C语言】函数系列中 自定义函数 点我跳转)

必须将s的地址(&s)传给set_Stu

但改成这样还是有问题

void set_Stu(struct S *t)
{*t.n = 150;*t.arr[0] = 3;
}set_Stu(&s);//省略main函数内的其他部分

 

“.”的优先级比“*”的高,必须加()

所以为:

	(*t).n = 150;(*t).arr[0] = 3;

结果:

实际上有结构体独有的写法,而且可读性好

备注:将结构体写入函数的格式说明

上方代码的这几处需要注意

void set_Stu(struct S *t)

struct S s = { {1,2,3,4,5},100 };

set_Stu(&s);

print_Stu(s);

Q:为什么不写成set_Stu(struct S s); print_Stu(struct S s);呢?

A:类比一般函数的传参

      如

int a=0; 
int function(int a)
{ //……
}

int a=0; 中int是变量类型,a是变量名,0是变量值

传参时function(int a)中int是变量类型,a是变量名

同样对于结构体:

struct S s = { {1,2,3,4,5},100 };

struct S相当于变量类型,s代表变量名

传参传的是变量名

void set_Stu(struct S *t)

struct S相当于变量类型,*t代表变量名

3.使用“结构体指针变量-->结构体成员变量”来修改结构体的数据

	t->n = 150;t->arr[0] = 3;

注:->为指向结构体成员运算符,用于访问结构体内的成员

结果依然一样:

4.传值还是传址?

在打印的时候用的是print_Stu(s);

尽管这样能成功实现打印结构体,但是建议使用print_Stu(&s)

原因:结构体与一般的数组不一样,当结构体中的数组比较大时(int arr[9999] )在传值时会复制一份一样的int arr[9999],占用大量空间,降低效率;若传址,则只占用地址的空间

因此:在使用结构体时,建议传址调用

这篇关于48.【C语言】结构体补充的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113453

相关文章

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时