函数传址,但无法改变xy数据问题
目录
问题
正确代码
两者区别
开启调试
设置监视的变量
逐过程调试
在自定义函数中调试
跳出自定义函数
对正确的代码进行调试
进入自定义函数
跳出自定义函数
为什么说编译器有问题
问题
今天遇到一个很有意思的问题分享一下。他写了一个交换数据的函数,但是传入参数是指针,但无法改变数据。代码如下
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void swap(int* a, int* b)
{int t;t = a;a = b;b = t;
}int main()
{int x = 12, y = 63;swap(&x, &y);printf("x=%d y=%d\n", x, y);return 0;
}
正确代码
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void swap(int* a, int* b)
{int t;t = *a;*a = *b;*b = t;
}int main()
{int x = 12, y = 63;swap(&x, &y);printf("x=%d y=%d\n", x, y);return 0;
}
两者区别
我们拿错误的代码进行调试,本人使用的是VS2013作为讲解,其他编译器都有调试功能和查看变量功能,建议学习一下。不过编译器快捷键应该都类似。
开启调试
(1)首先我们按F11进入调试。
(2)窗口->监视->监视1, 打开监视窗口。(注意,这个必须在调试模式下才有)
设置监视的变量
分别在名称下面写入变量名称。增加名称的方法是双击空白框。
逐过程调试
在自定义函数中调试
我们按F11可以进行逐过程调试。我们先按F11进入自定义函数中
我们逐过程运行,发现a和b指针指向的地址发生了改变,但是需要注意一点。指针指向地址的内容没有变!!!
这就是问题的关键! 因为我们发现,在逐过程调试过程,实参x和y的数据根本就没有变化!
跳出自定义函数
跳出自定义函数,形参释放,实参没有变化!
对正确的代码进行调试
进入自定义函数
现在我们依旧按照上面步骤进入自定义函数。
然后逐过程运行,到自定义函数快结束。我们发现x和y的值没有发生变化。(这个我猜是编译器调试有点小问题,影响不大。为什么我怀疑编译器调试有问题,后面讲)
跳出自定义函数
现在我们发现x和y的值发生了改变。为什么呢?因为在自定义函数中,我们是对指针所指向的区域进行了数据上的改变。这个改变是实实在在的,不会因为形参的释放数据而发生改变。
但是如果只是指针交换,那么随着形参的释放,这个指针交换并没有反应到实参当中。
为什么说编译器有问题
因为我们进行指针内部数据交换,x也要随着在自定义函数中的逐过程发生变化。但是这里没有,我怀疑是因为这个在自定义函数调试过程,编译器不会读取实参的数据。所以才没有进行实时变化。
函数传址,但无法改变xy数据问题相关推荐
- C++函数传参int a,int *a,int a,const int a的区别
C++函数传参int a,int &a,const int &a的区别 # 传参方式 作用 int a 值传递 无法改变a的值 int *a 地址传递 ...
- R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战
R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战 目录 R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战
- 2019数据安装勾选_万能的XY数据标签插件,柱形图也可以呈现变化率
今日分享主题:自定义单元格格式的数据标签在柱形图中的应用. 先说明下:本文操作使用的是2019版本,2013版本以上操作界面也差不多.如果是2013以下版本,操作界面可能会有差异,但功能都有,要自己找 ...
- 【ArcGIS微课1000例】0001:添加XY数据(Add XY data)生成shp
用过CASS的人都知道,野外数字测图得到的点数据(平面坐标)可以直接在CASS中展点,进一步绘制地形图.那么,带有坐标的数据能不能在ArcGIS中实现点图层的生成呢?答案是必须的! 本文以气象台站Ex ...
- x64汇编第三讲,64位调用约定与函数传参.
目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: ...
- 大数据时代:大数据引擎或改变大数据竞争格局
对于传统企业而言,无需任何繁杂的技术手段,只需要接入百度大数据引擎,即可利用大数据去帮助现有业务进行升级和创新了.峰哥认为百度此举是在加大此次大数据台风的风力.换一种角度看,这也是百度为了快速丰富各行 ...
- Java中long和int互相转换,不改变原有数据
Java中long和int互相转换,不改变原有数据 文章目录 Java中long和int互相转换,不改变原有数据 测试方法,及封装好的方法 封装好之后的方法 测试方法,及封装好的方法 @Test pu ...
- C++知识点7——函数传参
函数传参的原理和对象初始化的原理完全一致,用实参去初始化形参 函数传参的两种形式 1.按值传参 按值传参时,实参的拷贝用来初始化形参. int main(int argc, char const *a ...
- ant 改变表格数据_学不会这几个操作,面试时千万别说自己精通数据分析
今年的招聘季好像一直都不太景气,在现有的招聘岗位当中来看,只有一人身兼超多技能,才有可能在茫茫人海中脱颖而出,其中比较有含金量的技能比如说熟练运用Excel.精通数据分析工具,殊不知可不是掌握最基本的 ...
最新文章
- html实现pdf预览打印机,Pdf操作(HTML转PDF,PDF直接网页连接打印机)
- 利用棋盘格重新校正摄像头,求取Apriltag取向
- 从源文件中读出最后10KB内容到目的文件中
- post、get的区别
- windows清理图标缓存并重新加载
- mysql 多列合并为一列_多列数据合并一列,还在用数据透视就out了,用=号只要三步完成...
- ASP.NET MVC升级到ASP.NET Core MVC踩坑小结
- tidb vs mysql_一个长耗时SQL在TiDB和Mysql上的耗时测试
- 3D建模学什么?细分的话,有这么多方向
- git 入门教程之 git 私服搭建教程
- 在ASP.NET MVC中进行TDD开发
- 详解MySQL的用户密码过期功能
- 第1章 Python 顺序结构
- 基于阶梯灰度图法的空间光调制器相位延迟测量
- (山理工 1243)母牛问题(大牛生小牛,小牛生。。。。)
- 斜杠 反斜杠 双斜杠 双反斜杠
- shell批量替换文本中的多种字符串
- YTU OJ 母牛的故事
- 业务系统如何集成工作流系统?_K2 BPM集成能力讲解
- 全局钩子+正则表达式=后台自动获取扫描枪数据
热门文章
- 连载26:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)
- linux用root权限执行命令,Linux root权限获取之sudo命令详解
- Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信
- js将数字金额转换为大写人民币
- Python爬虫实战练习:爬取微信公众号文章
- 【node】升级 Node 版本教程
- 12个有效的域名工具及其生成器
- QSound一句代码播放简单的音效
- 央行工作会议说了什么:定向调控 松紧适度
- FCKeditor简介