CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)
对于一些疑难小问题,调试是不可避免的,很多时候我们想要跟踪程序发生了什么,每一步的值发生了哪些变化,这个时候查看监视窗口就显得很方便了。在C/C++里面,有些小伙伴对指针感到比较头痛,那我们就以指针为例来调试。
监视窗口可以查看调试的值,编译器需要选择GDB/CDB
Debug-->Active debuggers-->GDB/CDB debugger:Default
如果没有看到需要选择的编译器的话,可能需要进行配置:
Settings-->Debugger...-->GDB/CDB debugger(Default)
选择执行路径:D:\Program Files (x86)\CodeBlocks\MinGW\gdb32\bin\gdb32.exe
这个取决于你的安装地址
在需要查看的地方断点,然后点击红色按钮(F9),以及右边第三个有步进按钮(Step into),进行每步的调试,如果没有出现窗口,就点击Debug-->Debugging windows,选择Watches,或者直接就点击一个“虫”的小图标再选择Watches。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<typeinfo>using namespace std;int main()
{int a=3;int& b=a;//对a的引用int& c=b;//也可以对引用b再做引用cout<<a<<" "<<b<<" "<<c<<endl;//3 3 3
}
现在我们修改a的值,做一个断点,然后调试看下窗口里面的这些变量会出现什么变化。
int a=3;int a1=a;int& b=a;//对a的引用int& c=b;//也可以对引用b再做引用cout<<a1<<" "<<a<<" "<<b<<" "<<c<<endl;//3 3 3 3a=8;cout<<a1<<" "<<a<<" "<<b<<" "<<c<<endl;//3 8 8 8
可以看出,a1是拷贝了一份a的值,所以a的修改不会更改a1的值,其余的b和c变量的值都自动变化了,这也可以看出b,c只是a的引用,换句话说只是a的一个别名,a的值更改,也引起了指向它的引用的值发生更改。
再看一例,两个值交换的一个函数,参数使用引用类型
void exchange(int& x,int& y)
{int i;i = x;x = y;y = i;
}
int main()
{int z1=11;int z2=22;exchange(z1,z2);cout<<z1<<" "<<z2<<" "<<endl;//22 11
}
上面一步一步的步进调试,可以看出整个函数交换的操作步骤。
下面再看下指针,其实指针就是内存地址的叫法,不要想复杂,甚至指向指针的指针,也只是这个指向内存地址的一个内存地址。
int* 这个就是一个指针(内存地址),既然是地址,那赋值肯定也需要是地址,那就获取a的内存地址,&a,或叫取地址,赋值即可,是不是很简单。
int* p;p = &a;//取地址cout<<p<<endl;//这个就是a的内存地址cout<<*p<<endl;//8cout<<typeid(p).name()<<endl;//Pi
调试窗口是不是很清楚的显示了,p指向了a的内存地址,顺便说下,这个p在没有获取a的地址之前,会随机初始化一个地址,如果使用的话就成了”野指针”。使用完了之后free,但是没有置位NULL的话,也是个“野指针”,因为清空的只是指向的内存,而本身的这个地址还在的,这个需要注意。
int* p=NULL;故这样初始化NULL是正确的操作,初始化的内存地址就是0x0
留给大家一个二级指针的例子,自己可以去调试下:
int** pp;pp = &p;cout<<pp<<endl;cout<<*pp<<endl;cout<<typeid(pp).name()<<endl;//PPi
通过调试可以更加理解内存地址和值的变化,熟悉指针以及规范使用,不要造成“野指针”!
CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)相关推荐
- Visual Stdio 2022如何打开监视窗口?
编译器使用:Visual Stdio 2022 文章目录 一.为什么要使用监视窗口? 二.使用步骤 1.调试 2.打开监视窗口 3.输入需要监视的变量 如有问题请指正,谢谢! 一.为什么要使用监视窗口 ...
- VC的监视窗口等调试窗口的使用
一.监视窗口 1.配置应用程序,使应用程序处于调试状态. 2.点击"调试"----"窗口"----"监视"----"监视1&quo ...
- 监视窗口添加 $err,hr 一行来实时现实错误
在Visual C++ 中,可以在监视窗口添加 $err,hr 一行来实时现实错误.调试过程中,该项相当于在每次调用API函数之后调用GetLastError函数.其值由两部分组成,一个是错误代码(十 ...
- VS中监视窗口,即时窗口和输出窗口的使用
以下内容来自:http://shashoutian2005.blog.163.com/blog/static/1685415200971845843605/ 一.监视窗口 1.配置应用程序,使应用程序 ...
- LabVIEW(2014)探针监视窗口打不开/消失 解决办法
LabVIEW(2014)探针监视窗口 由于设定为总在其他窗口前面,所以有时在关闭后再打开时,明明任务栏上显示了窗口后,但是怎么也切换不到窗口. 解决办法很简单: 1.把鼠标移动到任务栏"探 ...
- vs2013如何调用监视窗口实现调试(如何打断点、逐步调试、逐过程调试、退出调试、条件调试)
目录 1.打断点进入调试窗口 2.F11逐步调试,F10整过程调试,shift+F5退出调试 3.条件调试 1.打断点进入调试窗口 双击代码前的空白即可,再次双击取消断点. 2.F11逐步调试,F10 ...
- codeblocks安装、使用、调试教程
一:下载 官方下载地址 二:安装 运行codeblocks-20.03mingw-setup.exe或FossHUB.界面如下: 点击"Next >" 点击"I A ...
- CodeBlocks编译环境配置及调试问题
CodebBocks官网下载自带编译器的安装包(安装过程不赘述) CodeBlocks下载及安装链接 值得注意的是,安装完成成后首次点开必须选择默认编译环境.选择如下图框选的GNU GCC,然后点击确 ...
- VScode像Codeblocks一样,不启动调试和Debug直接运行
要是配置C++ 编译环境,这边走 用了VScode童鞋,都知道,写C++是不保留窗口的,除非打上断点或者: system("pause"); 这里给大家分享一种不需要,F5或者Ct ...
最新文章
- Android程序完全退出的三种方法
- 引争议!硕导提议高校教师应多配偶,这样就能多生娃!高校的处理通报来了...
- R语言绘制三维散点图
- Python解决The truth value of a Series is ambiguous.md
- python filter函数 字符串_Python数组条件过滤filter函数使用示例
- Silverlight初级教程-库
- SegmentFault 创始人祁宁对话 C# 之父 Anders Hejlsberg
- java批处理 异常处理_Java批处理教程
- mac 查看端口并终结
- c语言字符串传给swift,如何把字符串数组从 Swift 传递给 C
- 重装linux服务器简易流程
- sql组合键设置外键_学习SQL:外键
- 人群与网络:博弈论基本概念
- unity的下载与安装
- hybird app混合开发介绍
- 移动端H5调起第三方APP
- mzy git学习,删除文件(三)
- 孙子兵法——02 作战第二
- 阿基米德螺旋线原理及代码
- 2019年伯克利大学 CS294-112《深度强化学习》第1讲:课程介绍和概览(笔记)