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

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

资料合集下载链接:

​​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)
  • 传递结构体指针以减少内存开销
  • 实现函数返回多个值(通过指针参数)
http://www.xdnf.cn/news/925471.html

相关文章:

  • Postman测试学习(1)
  • ABAP EXCEL导入换行符
  • A Survey on the Memory Mechanism of Large Language Model based Agents
  • 【Go语言基础【12】】指针:声明、取地址、解引用
  • 策略模式实战:Spring中动态选择商品处理策略的实现
  • 软件测试—学习Day10
  • 开疆智能Ethernet/IP转Modbus网关连接MAG8000电池流量计配置案例
  • python版若依框架开发:集成Dash应⽤
  • 将 Elastic 的数据摄取转向 OpenTelemetry
  • SWE-Dev:开启自主特征驱动软件开发新纪元,重新定义大模型编码能力边界
  • 理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合检索增强生成系统
  • 【Go核心编程】第十三章:接口与多态——灵活性的艺术
  • FUSSNet复现
  • vue注册自定义指令
  • 黄柏基因组-小檗碱生物合成的趋同进化-文献精读142
  • h5 安卓手机去掉滚动条问题
  • compose 组件 ---无ui组件
  • 基于TarNet、CFRNet与DragonNet的深度因果推断模型全解析
  • Python基于Django的文件销毁系统【附源码、文档说明】
  • Qwen 大模型-对话模板中system与user的区别解析
  • 并发编程实战(生产者消费者模型)
  • conda环境配置(二) —— 报错
  • QuickJS 如何发送一封邮件 ?
  • 区块链技术概述
  • Global Security Market知识点总结:主经纪商业务
  • 提高Python编程效率的工具推荐
  • Windows 系统安装 Redis 详细教程
  • 启程:为何选择PHP?
  • STM32学习笔记:定时器(TIM)原理与应用(详解篇)
  • Python入门手册:异常处理