codeblocks使用方法

codeblocks使用方法

一、简要介绍一下codeblocks

  自从使用了java之后,很少再用C/C++/C#了,不过这些语言真的挺不错的,最近偶然想要稳固一下指针方面的东西,就下载了codeblocks这个IDE,主要是这个IDE比较轻量级。以前也是用过很多次了,可是耐不住时间的侵蚀,很多东西都给忘了,包括一些基本的操作,因此很多东西都是温故而知新,需要记下来好好地为将来储备的,因此在此记录一下使用的方法吧。

二、使用方法

  2.1、下载

  首先我们从官网下载,在这里我们需要注意一下,我就是下载错误了,也是这个网站很坑了。如果我们随便下载一个,可能使用的时候只是半成品的,比如说前两个,其实是没有编译环境的,是的,没有编译器,自己还要从网上下载编译器,因此我们最好直接下载codeblocks-17.12mingw-setup.exe这个版本的,如果下载了nosetup的,就是已经配置好的,也是非常麻烦,特别是解压的时候非常的耗时,因此选对一个东西是非常重要的,关乎我们之后的种种。当然了不是在windows平台上,我们可以下载对应的版本的。

  2.2、使用

   安装完了codeblocks,我们就可以使用了,打开这个软件,我们新建一个程序,如果没有什么需要,我们可以简单地创建一个控制台程序,这个比较简单,之后我们在创建里面的文件,然后在文件之中进行编辑,这都比较简单,编辑完之后我们开始编译并执行,如果下载了由编译器的版本的,当然是成功了。编译的时候可能出现错误,就是找不到编译器,这个时候我们需要自己配置了。

扫描二维码关注公众号,回复: 1557285 查看本文章

  在设置中按照下面的路径进行设置,自我检测即可,按照我们的版本就能找到相应的编译器,之后就能编译运行了。

    2.3、调试

   如果到这里就完了,那这篇文章真的没有什么含量的,在这里说一下调试,每一个IDE都需要编译器和调试器,这是必须的,没有这两样,我不知道这个IDE存在的价值。因为我们写程序的时候总会遇到一些我们百思不得其解的问题,特别是程序比较大的时候,我们基本上都会出现一些细小的错误,有的势能在编译的时候发现的语语法错误,有的是只有运行时才会出现的运行时错误,因此我们需要调试器来设置断点调试,方法也比较简单,可是在codeblocks中,我们发现设置断点之后调试没有作用,原因也很简单,因为我们还需要配置,我不知道为什么不提前配置好了,估计是想让我们自己去探索吧。

   同样的,我们在设置中找到调试的按钮,然后找到安装目录XX\CodeBlocks\MinGW\bin之中的调试器,加入进去,然后我们就可以调试了。

    另外我们需要观察的变量的值,需要从调试-->调试窗口-->watches中观察,选中之后最好固定到最下面,这样就可以观察变量的值了。其他的可其他IDE差别不大。

三、指针的一点重新理解

   对于C语言的指针,是非常不安全的,可以随意的破坏内存,特别是对于附近的内存破坏非常大,但是对于很远的内存,因为虚地址保护模式的存在,会报错。指针也很灵活,将内存中的空间根据编译时候的类型进行划分,可以按字节、字、双字、四字等存取。在这里我们的一个概念,char *p='c',那么p--内存的地址减去的肯定是一个字节,原因是char类型的指针按字节寻址,而int *p=2;这样的p--则需要减去四个字节,因为int类型是占用四个字节的,这点非常重要,都是执行了‘减一’操作,结果却不同。另外关于指针,我们知道strcpy,strncpy都是不安全的,因为指针实在是太灵活了,很容易就越界覆盖了不该覆盖的空间,或者找不到终止符号‘\0’,一直向前查找等等问题。让我们看一个例子来理解一下。

 1 #include "stdio.h"
 2 
 3 int main(){
 4 
 5 
 6     int i1=1;
 7     int i2=2;
 8 
 9     int *p =&i1;
10 
11     printf("p: %d  ------  *p: %d  i1: %d\n", p, *p  ,&i1);
12     p--;
13     printf("p: %d  ------  *p: %d  i2: %d\n", p, *p  ,&i2);
14 
15 }
View Code

 

   我们看到确实int指针一次减少四个字节,并且我们的机器一般是按照小端编制的,地址向数值小的地方生长。也得到了正确的值。下面我们再看一下如果不在程序中出现&i2结果会有什么区别。

  让人难以置信的事情出现了,在这个时候你可能是怀疑IDE出问题了,可是结果就是这个样子,我们让p--,按理说我们第一个结果是1,第二个结果肯定是2,剩余的则是野指针在内存中肆意破坏了,可是为什么第二个数值不是2呢,或者是不是指向i2的地址呢??

  如果你学过编译原理,或许在吃惊之余能够想得明白,那就是在编译的阶段,编译器发现这个i2是个没用的东西,因为我们定义了之后在之后的程序中从来没有使用过,也就是只有声明,没有使用,遇到了这种事情,作为我们万能的编译器(功能很强大,比如指令重调度),当然是删除这个没用的i2了,只是因为这样,我们的程序中才会出现这样的运行结果。通过这个小小的例子,我们也发现,很多很不可理解的现象背后都是有着科学道理的,很多时候不可能是IDE出错了,反而是我们浅薄了,就是这样?至于是否是我说的这样,最后经过我的测试还真不是这样,让我们继续看一下去吧。

  如果我们再深究,我们发现下面的代码可是使用了i2了,为什么本来存放i2的地方还是不一样的呢,这就需要用到我们的进程数据存放位置的问题了,有的时候尽管使用了i2,可是指针管理的数据和非指针管理的数据存放的位置还是不一样的,有着不同的数据存放区,这就解释了我们的问题。

  其实我们再仔细看看,我们又大吃一惊,这个i2竟然还坚守着我们以前的位置,可是i1貌似是改道了,这涉及到编译器存放数据的位置,将同类的数据存放在一起,交换了一些位置,使得我们的分析出现了一些错误。除非我们使用i2的地址,这样编译器又将位置给换了过来,是不是很有意思呢?

   最后我们在程序中再加入char类型的指针,如下图,我们可以看到指针做的好事,上面的内存用过之后,编译器就让后面的指针给占用了,当然它知道是没用的内存了,其次,还是遇到了我们之前说的那个问题,将指针和不是指针类型的变量的地址调换存放了。

   通过上面的例子,我们可以看到一个问题的背后有着很多的原因,如果真的想深入理解原因,我们需要编译原理,OS,计算机组成原理,内存管理,进程线程等方面的知识,并且能够分析代码甚至是机器码,只有这样我们才能真的算是理解。同时我们确实意识到,这个指针真的是一个令人头大的东西,因此一定要慎用。

猜你喜欢

转载自www.cnblogs.com/zyrblog/p/9166244.html
今日推荐