目录

问题

正确代码

两者区别

开启调试

设置监视的变量

逐过程调试

在自定义函数中调试

跳出自定义函数

对正确的代码进行调试

进入自定义函数

跳出自定义函数

为什么说编译器有问题


问题

今天遇到一个很有意思的问题分享一下。他写了一个交换数据的函数,但是传入参数是指针,但无法改变数据。代码如下

#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数据问题相关推荐

  1. C++函数传参int a,int *a,int a,const int a的区别

    C++函数传参int a,int &a,const int &a的区别 # 传参方式                  作用 int a 值传递 无法改变a的值 int *a 地址传递 ...

  2. R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战

    R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战 目录 R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战

  3. 2019数据安装勾选_万能的XY数据标签插件,柱形图也可以呈现变化率

    今日分享主题:自定义单元格格式的数据标签在柱形图中的应用. 先说明下:本文操作使用的是2019版本,2013版本以上操作界面也差不多.如果是2013以下版本,操作界面可能会有差异,但功能都有,要自己找 ...

  4. 【ArcGIS微课1000例】0001:添加XY数据(Add XY data)生成shp

    用过CASS的人都知道,野外数字测图得到的点数据(平面坐标)可以直接在CASS中展点,进一步绘制地形图.那么,带有坐标的数据能不能在ArcGIS中实现点图层的生成呢?答案是必须的! 本文以气象台站Ex ...

  5. x64汇编第三讲,64位调用约定与函数传参.

    目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: ...

  6. 大数据时代:大数据引擎或改变大数据竞争格局

    对于传统企业而言,无需任何繁杂的技术手段,只需要接入百度大数据引擎,即可利用大数据去帮助现有业务进行升级和创新了.峰哥认为百度此举是在加大此次大数据台风的风力.换一种角度看,这也是百度为了快速丰富各行 ...

  7. Java中long和int互相转换,不改变原有数据

    Java中long和int互相转换,不改变原有数据 文章目录 Java中long和int互相转换,不改变原有数据 测试方法,及封装好的方法 封装好之后的方法 测试方法,及封装好的方法 @Test pu ...

  8. C++知识点7——函数传参

    函数传参的原理和对象初始化的原理完全一致,用实参去初始化形参 函数传参的两种形式 1.按值传参 按值传参时,实参的拷贝用来初始化形参. int main(int argc, char const *a ...

  9. ant 改变表格数据_学不会这几个操作,面试时千万别说自己精通数据分析

    今年的招聘季好像一直都不太景气,在现有的招聘岗位当中来看,只有一人身兼超多技能,才有可能在茫茫人海中脱颖而出,其中比较有含金量的技能比如说熟练运用Excel.精通数据分析工具,殊不知可不是掌握最基本的 ...

最新文章

  1. html实现pdf预览打印机,Pdf操作(HTML转PDF,PDF直接网页连接打印机)
  2. 利用棋盘格重新校正摄像头,求取Apriltag取向
  3. 从源文件中读出最后10KB内容到目的文件中
  4. post、get的区别
  5. windows清理图标缓存并重新加载
  6. mysql 多列合并为一列_多列数据合并一列,还在用数据透视就out了,用=号只要三步完成...
  7. ASP.NET MVC升级到ASP.NET Core MVC踩坑小结
  8. tidb vs mysql_一个长耗时SQL在TiDB和Mysql上的耗时测试
  9. 3D建模学什么?细分的话,有这么多方向
  10. git 入门教程之 git 私服搭建教程
  11. 在ASP.NET MVC中进行TDD开发
  12. 详解MySQL的用户密码过期功能
  13. 第1章 Python 顺序结构
  14. 基于阶梯灰度图法的空间光调制器相位延迟测量
  15. (山理工 1243)母牛问题(大牛生小牛,小牛生。。。。)
  16. 斜杠 反斜杠  双斜杠 双反斜杠
  17. shell批量替换文本中的多种字符串
  18. YTU OJ 母牛的故事
  19. 业务系统如何集成工作流系统?_K2 BPM集成能力讲解
  20. 全局钩子+正则表达式=后台自动获取扫描枪数据

热门文章

  1. 连载26:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)
  2. linux用root权限执行命令,Linux root权限获取之sudo命令详解
  3. Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信
  4. js将数字金额转换为大写人民币
  5. Python爬虫实战练习:爬取微信公众号文章
  6. 【node】升级 Node 版本教程
  7. 12个有效的域名工具及其生成器
  8. QSound一句代码播放简单的音效
  9. 央行工作会议说了什么:定向调控 松紧适度
  10. FCKeditor简介