C程序设计——再说说函数参数的值传递

news2024/12/23 11:06:49

上一篇的最后,我强调了C语言里,所有函数参数的传递,都是值传递,即形参值改变,不影响实参的值。

指针作为函数参数

我们知道,指针也是C语言的一个类型,所以指针,也可以作为函数参数,请看源代码:

int TestParam(int* ipA, int* ipB)
{
    printf("aa.  ipA == %x, ipB == %x\r\n", ipA, ipB);

    ipA = 0;
    ipB = 0;
    printf("ab.  ipA == %x, ipB == %x\r\n", ipA, ipB);
    return 0;
}

int main(void)
{
    int y, z ;
    int *ipa, *ipb;

    y = 0x10;
    z = 0x15;

    ipa = &y;
    ipb = &z;

    printf("a.   ipa == %x, ipb == %x\r\n", ipa, ipb);
    printf("b.   y == %x,   z == %x\r\n", y, z);

    TestParam(ipa, ipb);

    printf("c.   ipa == %x, ipb == %x\r\n", ipa, ipb);
    printf("e.   y == %x,   z == %x\r\n", y, z);
}

我们可以看到,上面的源码中,有六行打印,分别是 a,b,c,e, aa, ab ,从源码上看,main函数调用 TestParam 时,ipa 和 ipb 时实参,因此,aa行打印的ipA 和ipB的值,应该跟第a行是一样的。到打印 ab行之前,因为 ipA 和ipB 都被赋值为0了,因此,ab行打印的值应该是两个0。打印第c行时,因为形参改变,不影响实参,因此第c 行打印的值,应该跟a行是一样的。至于变量y 和 z的值,它俩在这个代码里,就是打酱油的,所以赋值之后就没有变化,一直是0x10 和0x15。所以代码执行结果如下:

如果我们把源码做一个小小的修改, 注意看注释:

int TestParam(int* ipA, int* ipB)
{
    printf("aa.  ipA == %x, ipB == %x\r\n", ipA, ipB);
/*******************************
    注意下面这两行,跟刚才不一样
*******************************/
    *ipA = 0; //注意这里跟刚才不一样
    *ipB = 0; //注意这里跟刚才不一样
    printf("ab.  ipA == %x, ipB == %x\r\n", ipA, ipB);
    return 0;
}

int main(void)
{
    int y, z ;
    int *ipa, *ipb;

    y = 0x10;
    z = 0x15;

    ipa = &y;
    ipb = &z;

    printf("a.   ipa == %x, ipb == %x\r\n", ipa, ipb);
    printf("b.   y == %x,   z == %x\r\n", y, z);

    TestParam(ipa, ipb);

    printf("c.   ipa == %x, ipb == %x\r\n", ipa, ipb);
    printf("e.   y == %x,   z == %x\r\n", y, z);
}

TestParam函数里,我没有改变形参的值,而是改变了形参指向的变量的值,我们知道ipA 和ipB的值分别是 ipa 和 ipb的值,而 ipa 和 ipb 又分别指向 x 和 y,因此下面这两行源码,改变的应该是x 和 y的值:

/*******************************
    注意下面这两行,跟刚才不一样
*******************************/
    *ipA = 0; //注意这里跟刚才不一样
    *ipB = 0; //注意这里跟刚才不一样

因此,主函数中,b行和 e行打印的值应该不一样,执行结果如下:

再次强调:C语言里,所有函数参数的传递,都是值传递,即形参值改变,不影响实参的值。上述代码里,TestParam的参数,是指针,而不是指针指向的值。因此TestParam函数里,只是通过形参指针改变了实参指针指向的值,并没有改变实参本身,因此再强调一遍:形参值改变,不影响实参的值。

形参和实参是两个不同的变量

请看源码,虽然形参变量名和实参变量名是一样的,但是他们是不同的变量,即形参改变不影响实参的值。

/*********************************************
    注意函数的形参变量名
*********************************************/
int TestParam(int x, int y)
{
    printf("aa.  x == %x, y == %x\r\n", x, y);

    x = 0;
    y = 0;
    printf("ab.  x == %x, y == %x\r\n", x, y);
    return 0;
}

int main(void)
{
    int x, y ;

    x = 0x10;
    y = 0x15;

    printf("b.   x == %x,   y == %x\r\n", x, y);

/*********************************************
    注意看实参的变量名
*********************************************/
    TestParam(x, y);

    printf("e.   x == %x,   y == %x\r\n", x, y);
}

所以上述代码,执行结果如下:

虽然形参变量名和实参变量名一样,但是他们是不同的变量,再强调一遍:形参值改变,不影响实参的值。

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

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

相关文章

【TPAMI 2024】一种用于混合事件-帧摄像机的异步线性滤波器架构

题目:An Asynchronous Linear Filter Architecture for Hybrid Event-Frame Cameras 一种用于混合事件-帧摄像机的异步线性滤波器架构 作者:Ziwei Wang; Yonhon Ng; Cedric Scheerlinck; Robert Mahony 摘要 事件相机非常适合捕捉高动态范围(HDR)视觉…

运维保障高效化的智慧能源开源了

一、简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,减少企业级应用约 95%的开发成本,在强大视频算…

【python因果推断库13】使用 PyMC 模型进行回归断点分析

目录 线性模型、主效应模型和交互作用模型 使用bandwidth 使用基样条 import causalpy as cp %load_ext autoreload %autoreload 2 %config InlineBackend.figure_format retina seed 42 df cp.load_data("rd") 线性模型、主效应模型和交互作用模型 PyMC 采样…

教学辅助微信小程序|基于SSM+vue的高校教学微信小程序系统(源码+数据库+文档)

高校教学 目录 基于SSM教学辅助微信小程序 一、前言 二、系统设计 三、系统功能设计 小程序端 后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&#x…

【Python】01.Python 介绍及其环境配置

一、计算机的基础概念 1.1 什么是计算机 所谓计算机,不光能进行算术运算,还能进行逻辑判断、数据存储、网络通信等等功能,以至于可以自动的完成非常复杂的工作。以下这些都可以称为 “计算机” : 1.2 冯诺依曼体系结构 而一台…

媒体服务器软件BUG说明及改进方案

媒体服务器软件BUG说明及改进方案 一、BUG描述二、问题分析三、改进方案四、实施计划五、预期效果六、总结一、BUG描述 在当前版本的媒体服务器中,存在一个关于静音媒体流处理的问题。具体表现为:当主叫连续发送静音帧到媒体服务器时,媒体服务器并未将这些静音帧转发给被叫…

闯关leetcode——13. Roman to Integer

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/roman-to-integer/description/ 内容 Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. SymbolValueI1V5X10L50C100D500M1000 For example, 2 is written …

CVE-2024-37032-Ollama漏洞

简介 Ollama是一个专为在本地环境中运行和定制大型语言模型而设计的工具。它提供了一个简单高效的接口,用于创建、运行和管理这些模型,同时还提供了一个丰富的预构建模型库,可以轻松集成到各种应用程序中。Ollama的目标是使大型语言模型的部…

Redis——初识Redis

初识Redis Redis认识Redis 分布式系统单机架构为什么要引入分布式理解负载均衡数据库的读写分离引入主从数据库 引入缓存数据库分库分表业务拆分——微服务常见概念了解 Redis背景介绍特性应用场景Redis不能做的事情Redis客户端redis客户端的多种形态 Redis 认识Redis 存储数…

flow model

https://www.youtube.com/watch?vuXY18nzdSsMcomponent by component(auto regresive)的生成模型存在的问题(生成的顺序,生成的速度慢);variational auto-encoder存在的问题(optimize a maxihood lower bound,是一个近似);genera…

【机器学习】隐马尔可夫模型的基本概念和应用领域以及在NLP中如何实现(含python代码)

引言 隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,用于描述一个含有隐含状态的马尔可夫过程 文章目录 引言一、隐马尔可夫模型的基本概念1.1 HMM的基本组成1.2 HMM的三个基本问题1.3 解决HMM问题的算法1.4 在python中…

Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64

Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64 1、准备工作2、安装数据库3、启停数据库4、后续步骤 💖The Begin💖点点关注,收藏不迷路💖 在Linux环境下安装神州通用数据库(ShenTong)是一个相对直…

如何通过 Apache Camel 将数据导入 Elasticsearch

作者:来自 Elastic Andre Luiz 使用 Apache Camel 将数据提取到 Elasticsearch 的过程将搜索引擎的稳健性与集成框架的灵活性相结合。在本文中,我们将探讨 Apache Camel 如何简化和优化将数据提取到 Elasticsearch。为了说明此功能,我们将实…

5G网络建设

题目描述 现需要在基城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基 站能互联互通,不同基站之间假设光纤的成本各不相同,且有些节点之间已经存在光纤…

8个动态着陆页案例及最佳实践

动态着陆页是一种让市场营销人员在不必因成百上千变量而抓狂的情况下,利用个性化力量的绝佳方式,从而让他们能够扩大努力并增长业务。使用像光年AI这样的平台,可以更方便地实现这一目标。 在这篇文章中,您将了解到: …

非监督式机器学习:群集

聚类分析是一种非监督式机器学习形式,在此形式下,基于观察值的数据值或特征的相似性,将观察值分组到群集中。 这种就是非监督式机器学习,因为它不使用先前已知的标签值来训练模型。 在聚类分析模型中,标签是群集&#…

【Nacos】健康检查与环境隔离

1. 健康检测 1.1 两种健康检查机制 Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务 Nacos 中提供了两种健康检查机制: 1. 客户端主动上报机制 客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,默认心跳间隔5秒:nacos会在超过15秒未收…

内网穿透之EW使用、判断服务器是否出网

环境搭建 使用的是下面文章的环境 记一次学习--内网穿透-CSDN博客 ew代理 然后同样通过thinkphp漏洞写入文件,然后通过蚁剑连接 然后上传ew的Linux版本,然后加权执行 一层代理 正向代理 设置正向代理(在ubuntu上)&#xff0…

React 发现无webpack相关的配置的目录,使用eject进行创建, 安装插件需要进行配置

React 发现无webpack相关的配置的目录,进行创建, 安装插件需要进行配置 react脚手架将webpack相关的配置隐藏起来了,如果想要看到webpack的配置可以执行package.json文件中的一个脚本:“eject”: “react-scripts eject”&#x…

流媒体之HLS协议(其三)

欢迎诸位来阅读在下的博文~ 在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力! 江山如画,客心如若,欢迎到访,一展风采 文章目录 前期博客参考书籍一、HLS协议简…