news 2026/4/15 7:03:33

c语言中swap函数的奥秘1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c语言中swap函数的奥秘1

之前学排序时,涉及到交换感觉次数太多,于是乎就想着去封装个函数

这还不简单

错误示范

思考

为啥没有交换呢,这不是放在主函数都可以的吗

等等,这么说的话,那我试一下在函数直接打印呢

果然,数据被交换了,这是为啥呢

我反复检查函数,发现了些问题

  1. 函数传入的是一个值还是其他东西
  2. 会不会只是传入了值,然后在主函数中变量并未被更改

启发

查阅资料我总结了这么些句话

在 C 语言中,一个局部变量(或全局变量)一旦被创建,它的内存地址在该作用域的生命周期内是固定的,不能更改。你只能改变它存储的“值”,不能改变它“住在哪里”(地址)。

函数内部的变量是局部的,即使你在主函数里写交换逻辑,也不能通过普通参数传值的方式影响外部变量

那么,上面就可以解释了

  1. 传入的是一个值不是地址
  2. 只在函数内部修改了a,b(由主函数函数传入)
  3. 一旦离开函数swap1,a,b就会被销毁,而x,y的地址没改

验证如下

解决方法

理论知识

因此想要改数据就得改地址,但是我们知道一个局部变量(或全局变量)一旦被创建,它的内存地址在该作用域的生命周期内是固定的,不能更改。你只能改变它存储的“值”,不能改变它“住在哪里”(地址)。

所以只能间接操作什么意思呢,我们可以根据上面重新审视变量

变量 = 值 + 地址 + 名字

所以我们不改变x , y 的原本地址,我们通过一下三步即可

  1. 通过指针取出x的值传给指针变量a(注意x,y的地址始终没变)
  2. 通过指针取出y的值传给指针变量b
  3. 交换,也就是把从x->1 y->2改为x->2 y->1

举个例子

就好比现在有信箱x和信箱y,分别装着信1和信2,有两位快递员a,b

  1. 上面第1步就是从信箱1把信1给快递员a(信箱位置不会变)
  2. 第2步就是从信箱2把信2给快递员b
  3. 第3步就是快递员b把信2送到信箱1,快递员a把信1送到信箱2

最终代码如下

#include <stdio.h> void swap1(int a,int b) { int temp = a; a = b; b = temp; printf("函数运行后(没到主函数)%d %d\n",a,b); } void swap2(int* a , int* b) { int temp = *a;//这里要注意temp只是用来临时存放,相当于快递中转站 *a = *b; *b = temp; } int main() { int x=1,y=2; printf("交换前%d %d\n",x,y); printf("%p %p\n",&x,&y); swap1(x,y); printf("%p %p\n",&x,&y); printf("交换后%d %d\n",x,y); printf("-------------------------\n"); printf("交换前%d %d\n",x,y); printf("%p %p\n",&x,&y); swap2(&x,&y); printf("%p %p\n",&x,&y); printf("交换后%d %d\n",x,y); }

本人经验不足,如有漏洞,还望指教,谢谢!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 20:09:52

GetQzonehistory终极教程:一键永久备份QQ空间所有历史记录

GetQzonehistory终极教程&#xff1a;一键永久备份QQ空间所有历史记录 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 想要将QQ空间里那些承载青春记忆的说说、留言和转发内容永远珍藏吗…

作者头像 李华
网站建设 2026/4/8 19:09:51

突破付费墙终极指南:Bypass Paywalls Clean让付费内容触手可及

突破付费墙终极指南&#xff1a;Bypass Paywalls Clean让付费内容触手可及 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在当今信息时代&#xff0c;优质内容往往被付费墙所阻挡&am…

作者头像 李华
网站建设 2026/4/11 15:21:12

Holistic Tracking应用案例:电竞选手动作分析系统

Holistic Tracking应用案例&#xff1a;电竞选手动作分析系统 1. 引言&#xff1a;AI驱动的精细化动作捕捉需求 随着电子竞技产业的快速发展&#xff0c;职业选手的操作表现已不再局限于键盘与鼠标的输入数据。越来越多的研究开始关注人体行为对操作稳定性的影响&#xff0c;…

作者头像 李华
网站建设 2026/4/5 9:21:03

突破付费墙限制:Bypass Paywalls Clean 完整使用指南

突破付费墙限制&#xff1a;Bypass Paywalls Clean 完整使用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 还在为优质内容被付费墙阻挡而烦恼吗&#xff1f;想看的深度报道、学…

作者头像 李华
网站建设 2026/4/13 15:13:02

智能内容解锁工具深度实战指南:从技术原理到完美应用

智能内容解锁工具深度实战指南&#xff1a;从技术原理到完美应用 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 还在为付费墙限制而烦恼吗&#xff1f;今天我们将带你深入了解现代内…

作者头像 李华
网站建设 2026/4/5 5:01:32

FFXIV插件开发实战指南:从零开始构建自定义游戏功能

FFXIV插件开发实战指南&#xff1a;从零开始构建自定义游戏功能 【免费下载链接】Dalamud FFXIV plugin framework and API 项目地址: https://gitcode.com/GitHub_Trending/da/Dalamud Dalamud框架作为最终幻想XIV插件开发的核心基础设施&#xff0c;为游戏玩家和开发者…

作者头像 李华