C语言从头学37——struct 指针

       在前文学习结构体变量的声明时,曾介绍过结构体指针变量的使用。这里介绍结构体指针,目的是找出在函数中处理作为参数的结构体变量的方法。
一、先看一个普通结构体变量作为参数的程序

typedef struct { int a; } myInt; //定义结构体别名(别名优点:不用总想着写struct)
myPrint(myInt myint) //定义一个使用结构体变量做参数的函数
{printf("a++前a=%i\n", myint.a);myint.a++;
}
#include<stdio.h>
int main(void)
{myInt myint = { 5 }; //声明结构体变量并赋初值myPrint(myint); //调用函数;运行结果 a=5printf("a=%i", myint.a); //看一下曾做过参数的结构体变量值;运行结果 a=5getchar();return 0;
}

       从上面这个小程序的运行结果看,结构体变量myint作为参数传入了myPrint函数,在myPrint函数中除了显示属性a的值外,还对a做了自增运算,但回到主程序再看变量myint属性a的值,结果a无动于衷,还是原来的值。分析原因,结构体变量作为参数传入函数时,函数内部得到的实际是一个原始值的副本。对副本做任何操作,原始值当然不会变。
二、结构体指针变量做函数参数情形
       当我们希望通过调用函数的方式对结构体变量进行处理,并希望结构体变量保留处理结果时,就需要使用结构体指针变量了。在前面学习《struct结构》时介绍了如何声明结构体指针,也学习了普通结构体变量调用属性用"."、结构体指针变量调用属性用"->",这些这里都会用到。
       我们把上面的程序做小的改动,将参数改成指针形式,函数体做相应改动,如下:

typedef struct { int a; } myInt; //定义结构体别名
myPrint(myInt* myint) //定义一个使用结构体指针变量做参数的函数
{printf("a++前a=%i\n", myint->a);myint->a++;
}
#include<stdio.h>
int main(void)
{myInt myint = { 5 }; //声明结构体变量并赋初值myPrint(&myint); //对myint取址成为指针进入函数;运行结果 a=5printf("a=%i", myint.a); //再看一下曾做过指针参数的结构体变量值;运行结果 a=6getchar();return 0;
}

       从程序运行结果看出,当结构体变量以指针形式进入函数时,在函数内对结构体变量所进行的操作,结果会保留在变量中。
       结论:当我们希望某函数仅仅是使用一下结构体变量的数据,不希望函数对数据进行修改时,进入函数参数的形式选择普通结构体变量;如果目的就是对结构体变量中数据进行加工,那就选择指针型结构体变量作为参数。

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

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

相关文章

Milvus 核心组件(3)--- MinIO详解

目录 背景 MinIO 安装 docker desktop 安装 Ubuntu UI 在 docker 中的安装 Minio 下载及安装 启动minio docker image 保存 启动 minio web 网页 下一次启动 MinIO基本概念 基本概述 主要特性 应用场景 MinIO 使用 连接server 创建bucket 查询bucket 上传文件…

Springboot集成Nacos配置

参考文档 Nacos 融合 Spring Boot&#xff0c;成为注册配置中心 | Nacos 官网​​​​​​​ 版本 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.1.RELE…

Layer2区块链扩容方案(1)——总述

写在前面 这篇文章作为一个简单介绍&#xff0c;很多技术只是大致提及或者引用&#xff0c;之后会在详细学习后逐项解释。 补充知识 在了解扩容方案之前&#xff0c;我们最好了解一些相关的知识概念 EVM “EVM” 是“Ethereum Virtual Machine”&#xff08;以太坊虚拟机&…

相机的内参与外参

目录 一、相机的内参二、相机的外参 一、相机的内参 如下图所示是相机的针孔模型示意图&#xff1a; 光心O所处平面是相机坐标系(O&#xff0c;P)&#xff0c;像素平面所在坐标系为像素坐标系(O’&#xff0c;P’)。 焦距f&#xff1a;O到O’的距离 相机的内参表示的是相机坐标…

100个python的基本语法知识【上】

0. 变量和赋值&#xff1a; x 5 name “John” 1. 数据类型&#xff1a; 整数&#xff08;int&#xff09; 浮点数&#xff08;float&#xff09; 字符串&#xff08;str&#xff09; 布尔值&#xff08;bool&#xff09; 2. 注释&#xff1a; # 这是单行注释 ""…

SQL Server数据迁移新纪元:数据库数据泵(Data Pump)使用指南

SQL Server数据迁移新纪元&#xff1a;数据库数据泵&#xff08;Data Pump&#xff09;使用指南 在数据管理的世界里&#xff0c;数据迁移是一个常见且复杂的过程。SQL Server提供了一个强大的工具——数据库数据泵&#xff08;Data Pump&#xff09;&#xff0c;它可以帮助我…

mysql面试(三)

MVCC机制 MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 即多版本并发控制&#xff0c;了解mvcc机制&#xff0c;需要了解如下这些概念 事务id 事务每次开启时&#xff0c;都会从数据库获得一个自增长的事务ID&#xff0c;可以从事务ID判断事务的执行先后…

QT 信号槽机制

核心函数为 QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type Qt::AutoConnection) 参数为 1.信号发生对象 2.信号发生对象的信号 3.槽对象 4.槽对象的槽函…

嵌入式linux系统中压力测试的方法

在Linux环境下,确保系统各项资源充分且稳定地运行对任何系统管理员来说都至关重要。特别是在生产环境中,理解如何对系统资源进行基准测试和压力测试可以帮助预防未来的问题,同时也能够优化现有系统的性能。 在本文中,我们将探讨如何使用命令行工具来对Linux系统的CPU、内存…

C语言 ——— 函数指针的定义 函数指针的使用

目录 何为函数指针 打印 函数名的地址 及 &函数名的地址 函数指针的代码&#xff08;如何正确存储函数地址&#xff09; 函数指针的使用 何为函数指针 类比&#xff1a; 整型指针 - 指向整型数据的指针&#xff0c;整型指针存放的是整型数据的地址 字符指针 - 指向字…

SQLynx数据库管理工具

背景&#xff1a;业主对网络安全要求比较高&#xff0c;不提供VPN等远程工具&#xff0c;也不能开放3306端口到互联网。那怎么样运维数据库就是个难题&#xff1f;找到了SQLynx这个可以网页访问的数据库管理工具&#xff0c;给大家分享一下。 1.介绍 SQLynx原名SQL Studio&…

防抖总结——OIS/EIS/HIS/DIS/机械防抖

文章目录 防抖总结OIS工作原理优缺点应用场景 电子防抖工作原理优缺点应用场景 混合防抖工作原理优缺点应用场景 数字防抖工作原理优缺点应用场景 机械防抖工作原理优缺点应用场景实例 防抖总结 防抖技术工作原理优点缺点适用场景光学防抖&#xff08;OIS&#xff09;通过内置…

[论文笔记] pai-megatron-patch Qwen2-72B/7B/1.5B 长文本探路

[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2-CSDN博客 Pai-Megatron-Patch (mcore代码) 长文本限制: 开SP之后,72B能开到16K,7B能开到32K。 但是72B开16K,或者7B开32K时,如果训练时训练样本中有长文本的话,则还是会OOM。 code: 相对于原repo加了一些代…

平面五杆机构运动学仿真matlab simulink

1、内容简介 略 89-可以交流、咨询、答疑 2、内容说明 略 ] 以 MATLAB 程序设计语言为平台 , 以平面可调五杆机构为主要研究对象 , 给定机构的尺寸参数 , 列出所 要分析机构的闭环矢量方程 , 使用 MATLAB 软件中 SIMULINK 仿真工具 , 在 SIMULINK 模型窗口下建立数…

麦田物语第十三天

系列文章目录 麦田物语第十三天 文章目录 系列文章目录一、实现根据物品详情显示 ItemTooltip1.ItemTooltips脚本编写二、制作 Player 的动画一、实现根据物品详情显示 ItemTooltip 1.ItemTooltips脚本编写 首先创建Scripts->Inventory->UI->ItemTooltip脚本,然后…

深入浅出WebRTC—LossBasedBweV2

WebRTC 同时使用基于丢包的带宽估计算法和基于延迟的带宽估计算法那&#xff0c;能够实现更加全面和准确的带宽评估和控制。基于丢包的带宽估计算法主要依据网络中的丢包情况来动态调整带宽估计&#xff0c;以适应网络状况的变化。本文主要讲解最新 LossBasedBweV2 的实现。 1…

docker 安装MySQL 8.4.1

拉取MySQL镜像 docker pull mysql:8.4.1 查看本地镜像 docker images 通过镜像生成容器 docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.4.1 查看目录运行中的容器列表 docker ps 进入容器内简单测试 docker exec -it mysql /bin/b…

使用 Swagger 在 Golang 中进行 API 文档生成

Swagger 是一款强大的 API 文档生成工具&#xff0c;可以帮助开发者轻松创建、管理和展示 RESTful API 文档。在本文中&#xff0c;我们将介绍如何在 Golang 项目中使用 Swagger 来生成 API 文档。 官网地址 &#xff1a; gin-swagger 前提条件 Golang 开发环境&#xff08;…

Docker Desktop安装

0 Preface/Foreward 1 安装 1.1 运行docker安装包 安装完Docker Desktop后&#xff0c;运行Docker Desktop&#xff0c;出现WSL 2安装不完整情况&#xff0c;具体情况如下&#xff1a; 解决方法&#xff1a;旧版 WSL 的手动安装步骤 | Microsoft Learn 也可以直接下载新的安…

Java设计模式:从单例到观察者

设计模式是解决特定问题的通用解决方案。在Java编程中&#xff0c;设计模式可以帮助我们编写更灵活、可维护和可扩展的代码。本文将介绍几种常见的Java设计模式&#xff0c;包括单例、工厂、策略、装饰器和观察者模式。 1. 单例模式 单例模式是一种创建型模式&#xff0c;它确…