当前位置: 首页 > article >正文

指针与函数参数传递详解 —— 值传递与地址传递的区别及应用

资料合集下载链接:

​​https://pan.quark.cn/s/472bbdfcd014​​

在C语言中,函数参数的传递方式主要有两种:值传递地址传递(通过指针)。理解两者的区别及应用对于正确操作数据和优化程序逻辑至关重要。本文将通过详细代码示例,帮助你彻底理解这两种传递方式,并演示如何利用指针实现对实参的修改,比如实现两个数的交换。


一、值传递(传值调用)

原理

函数接收的是实参的拷贝,函数内部对形参的操作不会影响到实参。

示例代码

#include <stdio.h>// 交换两个数(值传递)
void swap_by_value(int x, int y) {int temp = x;x = y;y = temp;printf("Inside swap_by_value: x = %d, y = %d\n", x, y);
}int main() {int a = 10, b = 20;printf("Before swap_by_value: a = %d, b = %d\n", a, b);swap_by_value(a, b);printf("After swap_by_value: a = %d, b = %d\n", a, b);return 0;
}

运行结果说明

Before swap_by_value: a = 10, b = 20
Inside swap_by_value: x = 20, y = 10
After swap_by_value: a = 10, b = 20
  • 函数内部​​x​​和​​y​​的值被交换了,但实参​​a​​和​​b​​的值没有发生变化。
  • 因为传入的是实参的拷贝,函数修改的是副本,不影响原变量。

二、地址传递(指针传递)

原理

函数接收的是实参变量的地址,通过指针可以间接修改实参的值。

示例代码

#include <stdio.h>// 交换两个数(指针传递)
void swap_by_pointer(int *x, int *y) {int temp = *x;*x = *y;*y = temp;printf("Inside swap_by_pointer: *x = %d, *y = %d\n", *x, *y);
}int main() {int a = 10, b = 20;printf("Before swap_by_pointer: a = %d, b = %d\n", a, b);swap_by_pointer(&a, &b);printf("After swap_by_pointer: a = %d, b = %d\n", a, b);return 0;
}

运行结果说明

Before swap_by_pointer: a = 10, b = 20
Inside swap_by_pointer: *x = 20, *y = 10
After swap_by_pointer: a = 20, b = 10
  • 函数接收了实参​​a​​和​​b​​的地址,利用指针间接修改了实参的值。
  • 实参​​a​​和​​b​​的值被真正交换。

三、总结对比

传递方式

形参类型

实参是否改变

优缺点

值传递

基本变量(拷贝)

不改变

简单安全,但无法修改实参

地址传递

指针(地址)

会改变

可修改实参,灵活但需注意指针安全


四、完整代码示例

#include <stdio.h>// 交换两个整数,值传递版
void swap_by_value(int x, int y) {int temp = x;x = y;y = temp;printf("Inside swap_by_value: x = %d, y = %d\n", x, y);
}// 交换两个整数,指针传递版
void swap_by_pointer(int *x, int *y) {int temp = *x;*x = *y;*y = temp;printf("Inside swap_by_pointer: *x = %d, *y = %d\n", *x, *y);
}int main() {int a = 10, b = 20;printf("---- 值传递示例 ----\n");printf("Before swap_by_value: a = %d, b = %d\n", a, b);swap_by_value(a, b);printf("After swap_by_value: a = %d, b = %d\n", a, b);printf("\n---- 地址传递示例 ----\n");printf("Before swap_by_pointer: a = %d, b = %d\n", a, b);swap_by_pointer(&a, &b);printf("After swap_by_pointer: a = %d, b = %d\n", a, b);return 0;
}

五、指针传递的其他应用场景

  • 修改数组元素
  • 动态内存管理(malloc/free)
  • 传递结构体指针以减少内存开销
  • 实现函数返回多个值(通过指针参数)

相关文章:

指针与函数参数传递详解 —— 值传递与地址传递的区别及应用

资料合集下载链接&#xff1a; ​​https://pan.quark.cn/s/472bbdfcd014​​ 在C语言中&#xff0c;函数参数的传递方式主要有两种&#xff1a;值传递和地址传递&#xff08;通过指针&#xff09;。理解两者的区别及应用对于正确操作数据和优化程序逻辑至关重要。本文将通过…...

【NLP中向量化方式】序号化,亚编码,词袋法等

1.序号化 将单词按照词典排序&#xff0c;给定从0或者1或者2开始的序号即可&#xff0c;一般情况有几 个特征的单词: PAD表示填充字符&#xff0c;UNK表示未知字符 在这个例子中&#xff0c;我们可以看到我们分别将3个文本分为了4个token&#xff0c;每个token用左侧的词典表示…...

C++学习-入门到精通【16】自定义模板的介绍

C学习-入门到精通【16】自定义模板的介绍 目录&#xff09; C学习-入门到精通【16】自定义模板的介绍前言一、类模板创建一个自定义类模板&#xff1a;Stack\<T\> 二、使用函数模板来操作类模板特化的对象三、非类型形参四、模板类型形参的默认实参五、重载函数模板 前言…...

关于脏读,幻读,可重复读的学习

mysql 可以查询当前事务隔离级别 默认是RR repeatable-read 如果要测脏读 要配成未提交读 RU 读到了未提交的数据。 3.演示不可重复读 要改成提交读 RC 这个是指事务还未结束&#xff0c;其他事务修改了值。导致我两次读的不一样。 4.RR–可以解决不可重复读 小总结&…...

源码级拆解:如何搭建高并发「数字药店+医保购药」一体化平台?

在全民“掌上看病、线上购药”已成常态的今天&#xff0c;数字药店平台正在以惊人的速度扩张。而将数字药店与医保系统打通&#xff0c;实现线上医保购药&#xff0c;更是未来互联网医疗的关键拼图。 那么&#xff0c;如何从技术底层搭建一个 支持高并发、可扩展、安全合规的数…...

旅行商问题(TSP)的 C++ 动态规划解法教学攻略

一、问题描述 旅行商问题&#xff08;TSP&#xff09;是一个经典的组合优化问题。给定一个无向图&#xff0c;图中的顶点表示城市&#xff0c;边表示两个城市之间的路径&#xff0c;边的权重表示路径的距离。一个售货员需要从驻地出发&#xff0c;经过所有城市后回到驻地&…...

unix/linux,sudo,其内部结构机制

我们现在深入sudo的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。 sudo 的内部结构与机制详解 sudo 的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安…...

Hadoop 3.x 伪分布式 8088端口无法访问问题处理

【Hadoop】YARN ResourceManager 启动后 8088 端口无法访问问题排查与解决(伪分布式启动Hadoop) 在配置和启动 Hadoop YARN 模块时&#xff0c;发现虽然 ResourceManager 正常启动&#xff0c;JPS 进程中也显示无误&#xff0c;但通过浏览器访问 http://主机IP:8088 时却无法打…...

Redis线程安全深度解析:单线程模型的并发智慧

Redis线程安全深度解析&#xff1a;单线程模型的并发智慧 引言&#xff1a;Redis的线程模型迷思 “Redis是单线程的”——这个广为流传的说法既正确又不完全正确。Redis的线程安全机制实际上是一套精心设计的并发控制体系&#xff0c;它既保持了单线程的简单性&#xff0c;又…...

零基础在实践中学习网络安全-皮卡丘靶场(第十期-Over Permission 模块)

经过这么长时间的学习&#xff0c;我相信大家已经有了很大的信心&#xff0c;有可能会有看不起的意思&#xff0c;因为皮卡丘是基础靶场&#xff0c;但是俗话说"基础不牢&#xff0c;地动山摇"&#xff0c;所以还请大家静下心来进行学习 来翻译一下是什么意思&#…...

北京大学肖臻老师《区块链技术与应用》公开课:12-BTC-比特币的匿名性

文章目录 1.比特币的匿名性不是真的匿名&#xff0c;相当于化名&#xff0c;现金是真的匿名&#xff0c; 2.如果银行用化名的话和比特币的匿名哪个匿名性更好&#xff1f; 银行匿名性比比特币好&#xff0c;因为比特币的区块链的账本是完全公开的&#xff0c;所有人都可以查&am…...

[Harmony]网络状态监听

权限 在module.json5中添加必要权限&#xff1a; // 声明应用需要请求的权限列表 "requestPermissions": [{"name": "ohos.permission.GET_NETWORK_INFO", // 网络信息权限"reason": "$string:network_info_reason","…...

毕设 基于机器视觉的驾驶疲劳检测系统(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景3 Dlib人脸检测与特征提取3.1 简介3.2 Dlib优点 4 疲劳检测算法4.1 眼睛检测算法4.2 打哈欠检测算法4.3 点头检测算法 5 PyQt55.1 简介5.2相关界面代码 6 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升…...

Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置

Ubuntu安装 1、VM 安装 Ubuntu后窗口界面太小 Vmware Tools 工具安装的有问题 处理办法&#xff1a; 1、重新挂载E:\VMwareWorkstation\linux.iso文件&#xff0c;该文件在VMware安装目录下 2、Ubuntu桌面出现vmtools共享文件夹&#xff0c;将gz文件拷贝至本地&#xff0c;解…...

Vue3中computed和watch的区别

文章目录 前言&#x1f50d; 一、computed vs watch✅ 示例对比1. computed 示例&#xff08;适合模板绑定、衍生数据&#xff09;2. watch 示例&#xff08;副作用&#xff0c;如调用接口&#xff09; &#x1f9e0; 二、源码实现原理&#xff08;简化理解&#xff09;1. comp…...

发版前后的调试对照实践:用 WebDebugX 与多工具构建上线验证闭环

每次产品发版都是一次“高压时刻”。版本升级带来的不仅是新功能上线&#xff0c;更常伴随隐藏 bug、兼容性差异与环境同步问题。 为了降低上线风险&#xff0c;我们逐步构建了一套以 WebDebugX 为核心、辅以 Charles、Postman、ADB、Sentry 的发版调试与验证流程&#xff0c;…...

瀚文(HelloWord)智能键盘项目深度剖析:从0到1的全流程解读

瀚文&#xff08;HelloWord&#xff09;智能键盘项目深度剖析&#xff1a;从0到1的全流程解读 一、项目整体概述 瀚文&#xff08;HelloWord&#xff09;智能键盘是一款多功能、模块化的智能机械键盘&#xff0c;由三大部分组成&#xff1a;键盘输入模块、可替换的多功能交互…...

Shell编程核心符号与格式化操作详解

Shell编程作为Linux系统管理和自动化运维的核心技能&#xff0c;掌握其常用符号和格式化操作是提升脚本开发效率的关键。本文将深入解析Shell中重定向、管道符、EOF、输入输出格式化等核心概念&#xff0c;并通过丰富的实践案例帮助读者掌握这些重要技能。 一、信息传递与重定…...

针对“仅某个地区出现Bug”的原因分析与解决方案

一、核心排查方向&#xff08;按优先级排序&#xff09; 地区相关配置差异 检查点&#xff1a; 该地区是否有独立的配置文件或数据库分片&#xff1f;是否启用了地区特定的功能开关&#xff08;Feature Flag&#xff09;或AB测试&#xff1f;本地化内容&#xff08;如语言、时…...

学习STC51单片机30(芯片为STC89C52RCRC)

每日一言 当你感到疲惫时&#xff0c;正是成长的关键时刻&#xff0c;再坚持一下。 IIC协议 是的&#xff0c;IIC协议就是与我们之前的串口通信协议是同一个性质&#xff0c;就是为了满足模块的通信&#xff0c;其实之前的串口通信协议叫做UART协议&#xff0c;我们千万不要弄…...

sql中group by使用场景

GROUP BY语句在SQL中用于将多个记录分组为较小的记录集合&#xff0c;以便对每个组执行聚合函数&#xff0c;如COUNT(), MAX(), MIN(), SUM(), AVG()等。GROUP BY的使用场景非常广泛&#xff0c;以下是一些典型的应用场景&#xff1a; 统计数量 当你想要计算某个字段的唯一值数…...

将HTML内容转换为Canvas图像,主流方法有效防止文本复制

HTML to Canvas 使用说明 项目概述 此项目实现了将HTML内容转换为Canvas图像的功能&#xff0c;可有效防止文本被复制。适用于需要保护内容的场景&#xff0c;如试题系统、付费内容等。 主要功能 防止复制: 将文本内容转换为Canvas图像&#xff0c;使用户无法选择和复制Mat…...

Python-进程

进程 简介 操作系统分配资源的基本单位 创建 依赖 依赖模块 multiprocessing 中的 Process 语法 Process(group[,target[,name[,args[,kwargs]]]]) target&#xff1a;如果传递了函数的引用&#xff0c;这个子进程就执行这里的代码args&#xff1a;元组的方式传递&#x…...

Paraformer分角色语音识别-中文-通用 FunASR demo测试与训练

文章目录 0 资料1 Paraformer分角色语音识别-中文-通用1 模型下载2 音频识别测试3 FunASR安装 &#xff08;训练用&#xff09;4 训练 0 资料 https://github.com/modelscope/FunASR/blob/main/README_zh.md https://github.com/modelscope/FunASR/blob/main/model_zoo/readm…...

【从0-1的CSS】第1篇:CSS简介,选择器以及常用样式

文章目录 CSS简介CSS的语法规则选择器id选择器元素选择器类选择器选择器优先级 CSS注释 CSS常用设置样式颜色颜色名称(常用)RGB(常用)RGBA(常用)HEX(常用)HSLHSLA 背景background-colorbackground-imagebackground-size 字体text-aligntext-decorationtext-indentline-height 边…...

对抗反爬机制的分布式爬虫自适应策略:基于强化学习的攻防博弈建模

在大数据时代&#xff0c;数据的价值不言而喻。网络爬虫作为获取数据的重要工具&#xff0c;被广泛应用于各个领域。然而&#xff0c;随着爬虫技术的普及&#xff0c;网站为了保护自身数据安全和服务器性能&#xff0c;纷纷采取了各种反爬机制。这就使得爬虫与反爬虫之间形成了…...

JDK21深度解密 Day 15:JDK21实战最佳实践总结

【JDK21深度解密 Day 15】JDK21实战最佳实践总结 文章简述 本篇文章是《JDK21深度解密:从新特性到生产实践的全栈指南》系列的第15篇,聚焦于JDK21实战最佳实践总结。作为Java历史上最重要的LTS版本之一,JDK21带来了虚拟线程、结构化并发、模式匹配、ZGC优化等革命性特性,…...

手写muduo网络库(一):项目构建和时间戳、日志库

引言 本文作为手写 muduo 网络库系列开篇&#xff0c;聚焦项目基础框架搭建与核心基础工具模块设计。通过解析 CMake 工程结构设计、目录规划原则&#xff0c;结合时间戳与日志系统的架构&#xff0c;为后续网络库开发奠定工程化基础。文中附完整 CMake 配置示例及模块代码。 …...

每日算法刷题Day25 6.7:leetcode二分答案3道题,用时1h40min(遇到两道动态规划和贪心时间较长)

3. 1631.最小体力消耗路径(中等,dfs不熟练) 1631. 最小体力消耗路径 - 力扣&#xff08;LeetCode&#xff09; 思想 1.你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左…...

14-Oracle 23ai Vector Search 向量索引和混合索引-实操

一、Oracle 23ai支持的2种主要的向量索引类型&#xff1a; 1.1 内存中的邻居图向量索引 (In-Memory Neighbor Graph Vector Index) HNSW(Hierarchical Navigable Small World &#xff1a;分层可导航小世界)索引 是 Oracle AI Vector Search 中唯一支持的内存邻居图向量索引类…...