收藏 分享(赏)

30天掌握C++精髓——经典教程.pdf

上传人:HR专家 文档编号:5087888 上传时间:2019-02-07 格式:PDF 页数:196 大小:3.86MB
下载 相关 举报
30天掌握C++精髓——经典教程.pdf_第1页
第1页 / 共196页
30天掌握C++精髓——经典教程.pdf_第2页
第2页 / 共196页
30天掌握C++精髓——经典教程.pdf_第3页
第3页 / 共196页
30天掌握C++精髓——经典教程.pdf_第4页
第4页 / 共196页
30天掌握C++精髓——经典教程.pdf_第5页
第5页 / 共196页
点击查看更多>>
资源描述

1、 1 1. 一个月挑战C+ 1 2. 挑战30天C+入门极限引言 . 2 3. 在c/c+中利用数组名作为函数参数传递排序和用指针进行排序的例 子。 . 4 4. c/c+中指针学习的两个绝好例子 6 5. 入门教程:C+中的const限定修饰符. 8 6. 新手入门:C+下的引用类型 10 7. 新手入门:C+中布尔类型 12 8. 新手入门:C/C+中枚举类型(enum). 14 9. 新手入门:C/C+中数组和指针类型的关系 . 16 10. 新手入门:关于C+中的内联函数(inline). 18 11. 新手入门:C+中的函数重载. 20 12. 新手入门:C+中堆内存(heap)的概

2、念和操作方法 21 13. C/C+中字符串常量的不相等性及字符串的Copy . 23 14. C/C+中字符指针数组及指向指针的指针的含义 25 15. 对C+中引用的补充说明(实例) 29 16. 新手入门:C/C+中的结构体. 36 17. C/C+中结构体(struct)知识点强化 . 44 18. C+面向对象编程入门:类(class) . 58 19. C+面向对象编程入门:构造函数与析构函数 70 20. 理解C+面向对象程序设计中的抽象理论. 84 21. C+类对象的复制拷贝构造函数 . 95 22. C+类静态数据成员与类静态成员函数 102 23. 入门教程:实例详解C+

3、友元.106 24. 图例实解:C+中类的继承特性111 25. C+中类的多态与虚函数的使用118 26. 图文例解C+类的多重继承与虚拟继承 .125 27. 类的分解,抽象类与纯虚函数的需要性 131 28. C+类的继承与多重继承的访问控制 133 29. C+运算符重载函数基础及其值返回状态.136 30. C+中利用构造函数与无名对象简化运算符重载函数 .142 31. 对C+递增(增量)运算符重载的思考 .147 32. C+运算符重载转换运算符151 33. C+运算符重载赋值运算符161 34. C+的iostream标准库介绍(1)164 35. C+的iostream标准

4、库介绍(2)173 36. C+的iostream标准库介绍(3)181 37. Eclipse3.06 + MinGW3.1配置标准C/C+开发环境 .189 1 1. 一个月挑战 C+ 作者:管宁 搜集整理:三尺寒冰 中国防黑网出品 COPYRIGHT 2005 2 2. 挑战 30天 C+入门极限引言 作为一个长篇的C+入门教程,无论如何也应该有这么个引言,可是文笔并不好的我,想了很久也不知道该如何写。仔细想想,与其把这篇短文当作教程的引言,其实它更应该是一篇引导初学者步入殿堂的策论。 几年并不算很长的编程经验,使我感触颇深,痛苦迷茫,以及成功后的喜悦一直交替着伴随我,爱好编程的我,

5、在学习期间也 被很多很多学习的困难疑惑所阻挡,甚至不只一次的想放弃。 让我初次领略到作为一个程序员应该有快乐与喜悦的是VISUAL BASIC语言,这些年为了工作,也学习过很多其它的语言,包 括时下正在流行的JAVA与C#等等,在这里不得不说的是,作为一个程序员,一个能够适应当前中国工作环境的程序员,你要学的 还远不止这些,包括数据系统,等等,等等。 很早就听人说过,如果你是一个程序员,如果你没有学过C语言,那么就不能算做是一个真正的程序员,这句话也许有点夸张, 不过当你学习过它以后就不得不承认这句话真的有那么几分道 理,C+语言是由语言发展而来的一种新的支持面向对象的语言,从一开始接触它,它

6、的魅力就深深的吸引着我,起初我和很多 想要学习它的人一样,觉得它很难懂,当时为了看懂,想明白一些现在看来真的很容易的例子时,真的有点让我抓狂。 作为一种灵活性高,体系庞大,支持面向对象思想的高级语言,C+的确比其它语言更难学习,很多正在学习它的在校大学生, 以及很多正在从事编程工作想自学它的程序员,对于它的入门及各必要知识点掌握苦恼不已。 其实学习C+和学习其它知识一样,并没有很多特别的要求,需要的只是那么一点点耐心,那么一点点忍耐力,以及遇到困难 挫折不轻易屈服的精神,更重要的一点是你必须有一本好的,适合你的入门书籍指引你逐渐进步,面对书店里种类繁多,出名的不 出名的+教材,不光是初学者就连

7、我也同样觉得眼花缭乱无从选择,很多优秀的国外+教材有着过于系统的知识面以及跳跃式 阅读的方法, 这对初学者,尤其是从小就习惯从头到结尾阅读书籍的中国人来说是不合适的,国内的教材多以大学教材为主,这些 书中的例子多以大学数学,或者工程数学举例,这样一来就把很多数学并不很好的读者拒之门外了。 在行内,很多人是不愿意和你分享学习经验的,一来工作任务繁重,再着很多人觉得这样会给自己带来更多的竞争对手。这些 我都亲身经历过,正是因为此类的种种感受,于是我由内心而发,真心实意的愿意帮助那些正在学习语言想入门的朋友们。从一开始学习计算机语言,几乎所有的人都会问到,我该如何入门,入门后又该如何继续持久的进步下

8、去呢?首先我要说的是, 计算机语言的入门,无论是/还是JAVA、 C#,他们都和高等数学没有太多联系,计算机语言是一种逻辑的文字描述,体现 逻辑的是思想,当你通过理解一些计算机语言所描述的,并不算难的逻辑问题后,你就已经掌握了语言本身,并且真正入门了。 当然,计算机语言毕竟是和数学有密切联系的产物,在计算机世界里他们彼此依赖谁也离不开谁,当你正确理解编程思想,掌 握必要知识点,入门之后,如果想做一个优秀的程序员而不是单单做一个程序的“拼装工“,你就不得不对数学知识进行进一步的系 统学习。 此长篇C+入门教程正是指引读者迈入C+殿堂的初级读本,目的只是帮助读者快速入门,掌握必要的知识点,为了让教

9、 程通俗易懂,容易理解,适合自学,笔者为此下了不少工夫,同时也和我的一些朋友讨论过,意见中值得注意的是, 一个作者如果 没有教学,就只知道摸索一种适合自己的学习方法,对于语言学习的难点重点,关键是如何将复杂的问题用朴素的“俗“文化来写, 3 针对这些问题笔者笔者是认真反思过的,所以全书完全站在初学读者的思考的角度来写,教程中完全不包括任何难以理解的高等数 学、工程数学问题,及+标准库知识,着重对各入门的难点重点详细讲解分析,相信认真学习并读过它的人绝对不会觉得是浪费 时间。 对于学习,创建一条由入门到深入最后到精通的可持续学习并不段发展的道路概括起来可以是以下顺序。 学习一些基本的语言知识,

10、例如:什么是变量,什么是函数 语言入门,基本知识点的掌握。 高等数学及工程数学的系统学习,结合实际了解并使用C+的各类常用的标准库。此外平时可以找一些广受好评的具备一定 深度的C+教材看一下,进一步理解+的高级编程精髓,以及看一些计算机原理和数据结构方面的书籍。 学习包括在各类操作系统下编程的必要知识,以Windows操作系统为例,需要学习掌握WIN API,以及高效开发的, 等在内的其它知识。 千里之行始于足下,路虽然很长,困难也会很多,不过你一旦入门,一定会觉得面前豁然开朗,会不段的激励着你学习下去的。 读者们如果在学习过程中有不懂的问题可以来我的站点提问,我会尽力解答的。站点地址:htt

11、p:/dev- 写到这里笔者也呼吁更多的程序高手们,敲起你的键盘,把你的优秀的经验和思想奉献出来,帮助更多需要的人,毕竟思想是 需要的是沟通的,知识是需要的是共享,快乐需要的是传递的。 最后在这里要感谢的是我的家人,我的父亲:管苗青、母亲:汪秋霞。多年来父亲母亲给我的帮助很大,一直耐心鼓励着我学 习,母亲对我学习上的帮助已及她优秀的自学经验思想是我一生中最重要的财富。 作者:管宁 二零零五年三月十七日凌晨三点半 4 3. 在 c/c+中利用数组名作为函数参数传递排序和用指针进行 排序的例子。 以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址。 #incl

12、ude void main(void) void reversal(); static int a10 = 0,1,2,3,4,5,6,7,8,9; /* 建立一个数组并初始化 */ int i; for (i=0;i10;i+) printf(“%d “,a); printf(“n“); reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组 a的起始地址传送给形式参数 x */ for (i=0;i10;i+) printf(“%d “,a); printf(“n“); void reversal(x,n) int x,n; /* 定义形式参数 */ int m=(

13、n-1)/2; /* 计算 10个数需要循环几次,因为是两两调换第一个数组是 x0故应该是 int(9/2) */ int temp,i,j; /* 建立零时变量 temp用于每次交换处理时零时存储 x的值 */ for (i=0;i=m;i+) j=n-1-i; /* 反向计算出被调换的数组下标,例如 x0 对应的 xn-1-i就是 x9 */ temp=x; x=xj; xj=temp; 5 /* 次题需要注意的是:这里由于 a10和 x10是共同享内存地址位的所以进行交换后 a10的实际值也就发生了改变 */ #include void main(void) void reversal

14、(); static int a10 = 0,1,2,3,4,5,6,7,8,9; /* 建立一个数组并初始化 */ int i; for (i=0;i10;i+) printf(“%d “,a); printf(“n“); reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组 a的起始地址传送给形式参数 x */ for (i=0;i10;i+) printf(“%d “,a); printf(“n“); void reversal(x,n) int *x,n; /* 定义 x为指针变量 */ int temp,*p,*i,*j; /* 这里需要注意的是 temp用

15、与交换的时候临时存储数据的 */ i = x; /* 利用指针变量 i存储数组 a的起始地址 */ p = x + (n-1)/2); /* 计算最后一次循环的时候数组 a的地址 */ j = x + n - 1; /* 计算数组 a也就是 a9的结束地址好用于交换 */ for (;i=p;i+,j-) /* 利用循环和指针进行数组元素值的交换 */ temp=*i; /* 用 temp临时存储*i也就是循环中 a实际的值 */ *i=*j; *j=temp; 6 /* 此例同样要注意到利用指针进行数组的操作同样改变了实际数组各元素的值 */ 4. c/c+中指针学习的两个绝好例子 对于众

16、多人提出的 c/c+中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的, 下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*x 和 x的理解,他们并不相同,*x所表示的其实就是变量 a 本身,x 表示的是变量 a在内存中的地址,如果想明白可以输出观察 cout main() int a,b; /* 定义 a,b两个整形变量用于输入两个整数 */ int *point_1,*point_2,*temp_point; /* 定义三个指针变量 */ scanf(“%d,%d“, /* 格式化输入 a

17、,b的值 */ point_1= /* 把指针变量 point_1的值指向变量 a的地址 */ point_2= /* 把指针变量 point_2的值指向变量 b的地址 */ if (ab) temp_point=point_1; /* 这里的 temp_point是用于临时存储 point_1的值也就是变量 a的地址的 */ point_1=point_2; /* 把 point_2的值赋予 point_1 */ point_2=temp_point; /* 由于 point_1的值已经改变无法找到,利用前面临时存储的也就是 temp_point 找回原 point_1的值赋予 point_

18、2,打到把 point_1和 point_2值对换的目的*/ printf(“%d,%d“,*point_1,*point_2); /* 利用*point_1和*point_2也就是分辨指向 b和 a的方法把值显示自爱屏幕上 */ /* 此题需要注意和了解是的此法并没有改变变量 a,b的值只是利用指针变量分别存储 a和 b的地址,然后再把那两个指针变量的值对换一 下其实就是存储在 指针变量里面 a与 b的地址对换,在利用*point_1和*point_2的方式把调换后的值显示出来这里的*point_1实际就是 a,此中算法并非真的 改变 a,b的值,而是 利用指针进行地址交换达到大小排序的目的

19、. */ 7 #include main() int a,b; /* 定义 a,b两个整形变量用于输入两个整数 */ int *point_1,*point_2; /* 定义三个指针变量 */ scanf(“%d,%d“, /* 格式化输入 a,b的值 */ point_1 = /* 把指针变量 point_1的值指向变量 a的地址 */ point_2 = /* 把指针变量 point_2的值指向变量 b的地址 */ compositor(point_1,point_2); /* 调用自定义的排序涵数,把 a,b的地址传递给 point_1和 point_2 */ printf(“%d,%

20、d“,a,b); /* 打印出 a,b的值 */ static compositor(p1,p2) int *p1,*p2; /* 定义形式参数 p1,p2为指针变量 */ int temp; /* 建立临时存储变量 */ if (*p1*p2) /* 如果*p1p2,注意这里的*p1和*p2其实就是 a和 b */ temp = *p1; /* 利用变量 temp用于临时存储*p1和就是 a的值 */ *p1 = *p2; /* 将*p1的值也就是 a的值换成*p2的值也就是 b的值,等价于 a=b */ *p2 = temp; /* 将*p2的值也就是 temp的值等价于 b=temp *

21、/ /* 注意:此题与上题不同的是,直接改变了 a于 b的值达到真实改变的目的 */ 8 5. 入门教程:C+中的 const限定修饰符 const修饰符可以把对象转变成常数对象,什么意思呢? 意思就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用! 使用方法是: const int a=1;/这里定义了一个int类型的const常数变量a; 但就于指针来说const仍然是起作用的,以下有两点要十分注意,因为下面的两个问题很容易混淆! 我们来看一个如下的例子: #include using namespace std; void main(void) c

22、onst int a=10; int b=20; const int *pi; pi= cout *pi “|“ a endl; pi= cout *pi “|“ b endl; cin.get(); 上面的代码中最重要的一句是 const int *pi 这句从右向座读作:pi是一个指向int类型的,被定义成const的对象的指针; 这样的一种声明方式的作用是可以修改pi这个指针所指向的内存地址却不能修改指向对象的值; 如果你在代码后加上*pi=10;这样的赋值操作是不被允许编译的! 好,看了上面的两个例子你对const有了一个基本的认识了,那么我们接下来看一个很容易混淆的用法! 请看如下的

23、代码: 9 #include using namespace std; void main(void) int a=10; const int *const pi= cout using namespace std; void main(void) const int a=10;/这句和上面不同,请注意! const int *const pi= cout *pi “|“ a endl; cin.get(); 10 6. 新手入门:C+下的引用类型 引用类型也称别名,它是个很有趣的东西。在c+ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作 对象,引用类型主要是用在

24、函数的形式参数上,通常我们使用它是把类对象传递给一个函数。 引用对象采用类型名加上),这里我们就定义了一个int类型的名为test 的引用,但是int 这样的方式是不能够被编 译成功的,因为引用的定义必须同时给应用进行赋值操作,这里的赋值并不是说把变量的值传递给引用,而是把引用指向变量,写成这 样就对了:(int )。 #include using namespace std; void main(void) int a=10; int test=test+2; cout using namespace std; void main(void) int a=10; /double /这句就是错

25、误的! const double 11 cout cin.get(); 上面的代码足够说明问题了,这就是const修饰带来的好处,但是聪明的人会在输出的时候发现一个问题,就是a和test的值的输 出不同,按照最先说的道理应该可以改变a的值呀,为什么在这里却有没有能够改变呢? 道理是这样的,const修饰过后的引用在编译器内部是这样进行变化的。 int a=10; const double 这样的一段代码在编译器认为却是下面的方式进行的 int a=10; int temp = a; const double void main(void) bool found = true; if (fou

26、nd) cout #include using namespace std; void main(void) bool found = true; int a = 1; cout a + found endl; cin.get(); a+found 这样的表达式样是成立的,输出后的值为2进行了加法运算! 13 那么说到这里很多人会问指针也可以吗?回答是肯定的这样一个概念对于指针同样也是有效的,下面我们来看一个将整形指针对象 当作布尔对象进行使用的例子: #include using namespace std; void main(void) int a = 1; int *pi; pi=

27、if (*pi) cout “*pi为真“ endl; cin.get(); 上面代码中的*pi进行了隐式样的布尔类型转换表示为了真也就是true。 14 8. 新手入门:C/C+中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况 也可以说是可能的值一一例举出来。 举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅 笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它! enum boxpencil,pen;/这里你就定义了一

28、个枚举类型的变量叫 box, 这个枚举变量内含有两个元素也称枚举元素在这里是 pencil 和 pen, 分别表示铅笔和钢笔。 这里要说一下,如果你想定义两个具有同样特性枚举类型的变量那么你可以用如下的两种方式进行定义! enum boxpencil,pen; enum box box2;/或者简写成 box box2; 再有一种就是在声明的时候同时定义。 enum pencil,penbox,box2; /在声明的同时进行定义! 枚举变量中的枚举元素系统是按照常量来处理的,故叫枚举常量,他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错 误的,但是你可以在声明的时候进行赋值

29、操作! enum boxpencil=1,pen=2; 但是这里要特别注意的一点是,如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作,说到自动赋 值,如果你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1操作,例如 enum boxpencil=3,pen;/这里 pen就是 4系统将自动进行 pen=4的定义赋值操作! 前面说了那么多,下面给出一个完整的例子大家可以通过以下的代码的学习进行更完整的学习! #include using namespace std; void main(void) 15 enum egg a,b,c; enum egg t

30、est; /在这里你可以简写成 egg test; test = c; /对枚举变量 test进行赋予元素操作, 这里之所以叫赋元素操作不叫赋值操作就是为了让大家明白枚举变量是不能直接赋予算 数值的,例如(test=1;)这样的操作都是不被编译器所接受的,正确的方式是先进行强制类型转换例如(test = (enum egg) 0;)! if (test=c) cout using namespace std; void main(void) enum test a,b; int c=1+b; /自动提升为算术类型 cout c endl; cin.get(); 16 9. 新手入门:C/C+

31、中数组和指针类型的关系 对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关 系的了解可以更加深入的掌握数组和指针特性的知识! 一个整数类型数组如下进行定义: int a=1,2,3,4; 如果简单写成: a;/数组的标识符名称 这将代表的是数组第一个元素的内存地址,a;就相当于 a+1/注意这里的表示就是将 a数组的起始地址向后进一位,移动到第二个元素的地址上也就是 a0到 a1的过程! 数组名称和指针的关系其实很简单,其实数组名称代表的是数组的第一个元素的内存地址,这和指针的道理是相似的! 下面我们来看一个完整的例子,利用指针来

32、实现对数组元素的循环遍历访问! #include using namespace std; void main(void) int a2=1,2; int *pb=a; /定义指针*pb的地址为数组 a的开始地址 int *pe=a+2; /定义指针*pb的地址为数组 a的结束地址 cout a “|“ a0 “|“ *(a+1) “|“ pb “|“ *pb endl; while (pb!=pe) /利用地址进行逻辑判断是否到达数组的结束地址 17 cout *pb endl; pb+; /利用递增操作在循环中将 pb的内存地址不断向后递增 cin.get(); 18 10. 新手入门

33、:关于 C+中的内联函数(inline) 在c+中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数。 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下, 栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,函数的死循环递归调用的最终结果就是导致栈 内存空间枯竭。 下面我们来看一个例子: #include #include using namespace std; inline string dbtest(int a); /函数原形声明为 in

34、line即:内联函数 void main() for (int i=1;i0)?“奇“:“偶“; 上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的 内部所有调用dbtest(i)的地方都换成了(i%20)?“奇“:“偶“这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。 说到这里很多人可能会问,既然inline这么好,还不如把所谓的函数都声明成inline,嗯,这个问题是要注意的,inline的使用 是有所限制的,inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while switch,并

35、且不能内联函数本身 不能是直接递归函数(自己内部还调用自己的函数)。 19 说到这里我们不得不说一下在c语言中广泛被使用的#define语句,是的define的确也可以做到inline的这些工作,但是define 是会产生副作用的, 尤其是不同类型参数所导致的错误, 由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性, 在c+ 中是不推荐使用define的。 关于内联函数的更多例子我就不一一举出了,灵活的使用也多靠学习者本身,我只在此抛砖引玉,让大家尽可能多的学习到c+中的 一些新的先进的特性知识点。 20 11. 新手入门:C+中的函数重载 函数重载是用来描述同名函数具

36、有相同或者相似功能,但数据类型或者是参数不同的函数管理操作的称呼。 我们来举一个实际应用中的例子来说明问题:我们要进行两种不同数据类型的和操作为了实现它,在c语言中我们就要写两个不同名 称的涵数来进行区分例如:int testa(int a,int b)和float testb(float a,floatb),这样字是没有问题,但是总有一点不好,这么两个 具备极其相似操作函数我们却起两个不同的名字,这样子不是很好管理,所以c+为了方便程序员编写程序特别引入了函数重载的概念来 解决此问题,我们看看如下的代码: #include using namespace std; int test(int

37、a,int b); float test(float a,float b); void main() cout test(1,2) endl test(2.1f,3.14f) endl; cin.get(); int test(int a,int b) return a+b; float test(float a,float b) return a+b; 在上面的程序中我们同样使用了两个名为test的函数来描述int类型和操作的和float类型和操作,这样一来就方便了程序员对相 同或者相似功能函数的管理。 看了上面的解释很多人会问,这么一来计算机该如何来判断同名称函数呢?操作的时候会不会造成选

38、择错误呢? 回答是否定的。 c+内部利用一种叫做名称粉碎的机智来内部重命名同名函数, 上面的例子在计算重命名后可能会是testii和testff 他们是通过参数的类型或个数来内部重命名的,关于这个作为程序员不需要去了解它,说一下只是为了解释大家心中的疑问而已。好了, 关于函数学重载的基础知识就说到这里,至于如何利用这个功能,就靠大家在日常的学习或者是工作中逐渐摸索了。 21 12. 新手入门:C+中堆内存(heap)的概念和操作方法 堆内存是什么呢? 我们知道在c/c+中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作 中,我们有时候却需要动

39、态的为数组分配大小,在这里c库中的malloc.h头文件中的malloc()函数就为您解决了问题(bc或者是在老 的标准中是alloc.h),它的函数原形是void* malloc(size_t size),在动态开辟的内存中,在使用完后我们要使用free()函数来释放 动态开辟的内存空间。 下面我们来看一个完整的例子: #include #include using namespace std; main() int arraysize; /元素个数 int *array; /用于动态开辟数组的指针变量 cinarraysize; array=(int*)malloc(arraysize * sizeof(int);/利用 malloc在堆内存中开辟内存空间,它的大小是元素的个数乘以该数据类型的长度 for(int i=0;iarraysize;i+) arrayi=i; for(int i=0;iarraysize;i+) coutarrayi“,“; coutendl; free(array);/利用 free释放动态开辟的堆内存空间 cin.get(); cin.get(); 这里要特别注意个地方就是:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报