CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)

        对于一些疑难小问题,调试是不可避免的,很多时候我们想要跟踪程序发生了什么,每一步的值发生了哪些变化,这个时候查看监视窗口就显得很方便了。在C/C++里面,有些小伙伴对指针感到比较头痛,那我们就以指针为例来调试。

监视窗口可以查看调试的值,编译器需要选择GDB/CDB
Debug-->Active debuggers-->GDB/CDB debugger:Default 

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第1张图片

如果没有看到需要选择的编译器的话,可能需要进行配置:
Settings-->Debugger...-->GDB/CDB debugger(Default)
选择执行路径:D:\Program Files (x86)\CodeBlocks\MinGW\gdb32\bin\gdb32.exe
这个取决于你的安装地址

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第2张图片

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第3张图片

在需要查看的地方断点,然后点击红色按钮(F9),以及右边第三个有步进按钮(Step into),进行每步的调试,如果没有出现窗口,就点击Debug-->Debugging windows,选择Watches,或者直接就点击一个“”的小图标再选择Watches。

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第4张图片

#include
#include
#include
#include
#include

using namespace std;

int main()
{
    int  a=3;
    int& b=a;//对a的引用
    int& c=b;//也可以对引用b再做引用
    cout<

现在我们修改a的值,做一个断点,然后调试看下窗口里面的这些变量会出现什么变化。

    int  a=3;
    int  a1=a;
    int& b=a;//对a的引用
    int& c=b;//也可以对引用b再做引用
    cout<

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第5张图片

可以看出,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<

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第6张图片

 CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第7张图片

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第8张图片 

 CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第9张图片

 CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第10张图片

上面一步一步的步进调试,可以看出整个函数交换的操作步骤。

        下面再看下指针,其实指针就是内存地址的叫法,不要想复杂,甚至指向指针的指针,也只是这个指向内存地址的一个内存地址。
int* 这个就是一个指针(内存地址),既然是地址,那赋值肯定也需要是地址,那就获取a的内存地址,&a,或叫取地址,赋值即可,是不是很简单。

    int* p;
    p = &a;//取地址
    cout<

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第11张图片        调试窗口是不是很清楚的显示了,p指向了a的内存地址,顺便说下,这个p在没有获取a的地址之前,会随机初始化一个地址,如果使用的话就成了”野指针”。使用完了之后free,但是没有置位NULL的话,也是个“野指针”,因为清空的只是指向的内存,而本身的这个地址还在的,这个需要注意。

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第12张图片
 

CodeBlocks监视窗口(Watchs)进行调试(引用类型与指针)_第13张图片 int* p=NULL;故这样初始化NULL是正确的操作,初始化的内存地址就是0x0

 留给大家一个二级指针的例子,自己可以去调试下:

    int** pp;
    pp = &p;
    cout<

通过调试可以更加理解内存地址和值的变化,熟悉指针以及规范使用,不要造成“野指针”!

你可能感兴趣的:(其他(Others),C++调试窗口,C++,Watches,C++指针)