《C++程序设计案例教程-PPT-new完整版课件全套ppt教学教程最全整套电子教案电子讲义.ppt》由会员分享,可在线阅读,更多相关《C++程序设计案例教程-PPT-new完整版课件全套ppt教学教程最全整套电子教案电子讲义.ppt(451页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1.1 面向对象程序设计 1.2 C+程序设计 1.3 C+程序的开发过程 1.4 面向对象程序的组成元素,第1章 绪论,1.5 C+程序的编译与调试 1.6 本章小结,返回目录,1.1 面向对象程序设计,面向过程程序设计的缺点:,缺点,出现背景,缺乏数据和代码的保护机制 这种程序设计方法缺乏代码重用机制,面向对象程序设计的优点:,按习惯对问题领域进行自然分解 注重需求分析和设计反复 数据抽象和信息隐蔽等机理使得对象内部实现与外界隔离,能对数据有效保护 继承使得代码重用成为可能 可维护性好,基本概念,什么是对象? 什么是类?,知识点概述,对象是系统中的基本运行实体,是有特殊属性(数据)和行为方
2、式(方法)的实体。,类是对具有公共的方法和一般特殊性的一组基本相同对象的描述。,基本概念,什么是消息? 什么是方法?,知识点概述,方法是对象本身内含的执行特定操作的函数或过程,消息(Message)用来请求对象执行某一处理或回答某些信息的请求,例如,一个汽车对象具有行驶这项操作,那么要让汽车以时速50公里行驶的话,我们需传递给汽车对象行驶及时速50公里的消息,以触发这个对象。,知识点概述,优缺点,优点:,符合认识论的观点 能尽量逼真地模拟客观世界及其事物 先进的开发方法 软件适应性广 以对象为中心的程序设计,缺点:,描述局限性 具体实现困难,知识点概述,理论基础,分类学基础 分类 聚合 泛化和
3、特化 思维科学基础 抽象思维过程 概念建模与抽象思维过程 方法学基础,基本特征,封装性(Encapsulation) 封装就是隐藏对象的属性和实现细节,仅对外提供公开接口 继承性(Inheritance) 继承描述的不同类型之间的一种关系,它可以扩展不同类型的功能,基本特征,多态性(Polymorphism) 多态指的是同一个操作作用于不同的对象,可以产生不同的效果 抽象性(Abstract) 抽象性是指将具有相同属性和行为的一组对象抽象为类,面向对象程序设计与面向过程程序设计,程序 =(模块 + 模块 + ),模块 =(算法)+(数据结构),程序 =(对象 + 对象 + ),对象 =(数据结
4、构 + 算法),面向对象程序设计与面向过程程序设计,方法与步骤,面向对象分析OOA 面向对象的设计OOD 面向对象的实现OOI,1.2 C+程序设计,返回目录,C+语言的产生,1982年, Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。开始这种语言被称为new C,后来改为C with Class,1983年12月,Rick Mascitti建议命名为CplusPlus,即C+。C+的发展大致可分为了三个阶段: 第一阶段从C+语言出现到1995年,这一阶段C+语言基本上是传统类型上的面向对象语言,并且依靠接近C语言的效率,在这期间Bj
5、ame博士完成了经典巨著The C+ Programming Language第一版;诞生了一个传世经典ARM;之后模板、异常、命名空间等相继被加入。 第二阶段从1995年到2000年,这一阶段由于STL库和后来的Boost库等程序库的出现,泛型程序设计在C+中比重越来越大,同时由于Java、C#等语言的出现和硬件的影响,C+受到了一定的冲击。 第三阶段从2000年至今,由于Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C+出现了发展上的又一个高峰。,C+简介,C+的特点,C+简介,C+的应用领域,应用程序平台,系统级框架,机器人及工业控制系统,高性能实时计算,手机智能设备,C
6、AD、CAE、CAM等,多媒体游戏等,航空航天系统等,C+语言的程序设计体系,1.3 C+程序开发过程,返回目录,面向过程程序举例,面向过程的程序是由函数构成的,其基本结构为:函数的定义+函数的调用,查看详情,程序1-1:输出字符串“Hello” #include /*函数功能:输出字符串“Hello” 函数名称:print 函数参数:str-字符指针 函数返回值类型:void */,void print(char* str) printf(“%f”,hello); int main() char* hello=“Hello”; print(hello);/函数调用 return 0; ,io
7、stream文件,第1行代码包含了输入输出头文件 iostream,它是标准的C+头文件,在旧的标准C+中,使用的是iostream.h,实际上这两个文件是不同的,在编绎器include文件夹里它是两个文件,并且内容不同。后缀为.h的头文件C+标准明确提出不支持了,早期在C+中调用.h头文件其实相当于调用的C标准库,为了和C语言区分开,C+标准规定不使用后缀.h的头文件,例如C语言中的string.h头文件,C+用cstring,C语言中的math头文件,C+使用cmath头文件。这不只是形式上的改变,其实现也有所不同。,返回,面向过程程序举例,#include #include using
8、namespace std; class Person/类的定义 private: String words;/类的数据成员 public: /成员函数定义 /*函数功能:给数据成员赋值 函数名称:setWords 函数参数:wordstring类型,C+中定义的字符串类 返回类型:void,空类型,表示没带回任何值给调用的函数 */,面向对象的程序是由对象构成的,要定义对象得先定义类。其基本结构:类的定义+类的使用,void setWords(string word) Words=word; /*函数功能:输出数据成员的值 函数名称:say 函数参数:void 返回类型:void */ vo
9、id say() Coutwords; ; int main() Person girl;/Person类对象的定义 girl.setWords(“How are you!”); /调用成员函数 girl.speak();/调用成员函数 system(pause); return 0; ;,面向过程程序举例,第一个C+程序,命名空间,命名空间实际上是由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间区域,把一些自己定义的变量、函数等标识符存放在这个空间中,从而与其他实体定义分隔开来。其定义格式如下所示:,namespace 空间名,namespace是定义命名空间的关键字,
10、空间名可以用任意合法的标识符,在内声明空间成员,例如定义一个命名空间A1,代码如下所示:,namespace A1 int a = 10; ,变量a只在A1空间内(作用域)有效,命名空间的作用就是建立一些互相分隔的作用域,把一些实体定义分隔开来。,下一页,1.4 面向对象程序的组成元素,返回目录,名字空间,解决命名冲突,使用方法:,利用using namespace 使用名字空间,using namespace std; 表明此后程序中的所有对象如没有特别声明,均来自名字空间std,多学一招: 匿名命名空间,用域分辨符:为对象分别指定名字空间,std:cout “Hello C+”std:en
11、dl;,使用using与域分辨符指定名字空间,using std:cout; 表明此后的cout对象如没有特别,均取自名字空间std中。,输入输出流,cin与cout,cin与提取运算符“”结合使用,读入用户的输入,可连续输入,以空白(包括空格、回车、TAB)为分隔符。 cout与插入运算符“”结合使用,打印消息。通常它还会与操纵符endl使用,endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的数据刷新到设备中,保证程序所产生的所有输出都写入输出流中,而 不是仅停留在内存中。,返回,1.5 C+程序的编译与调试,返回目录,源程序的编译与运行,新建项目,添加源文件,编写代码,
12、案例代码,源程序的编译与运行,C+语言的编译环境有多种,如: Microsoft Vistual Studio,C+ Builder ,Qt Creator, Borland C+等,其中: Turbo C3.0,Borland C+3.1是在DOS环境下的编译系统。不同的编译器对C+的支持度是不一样的。由于Visual Studio 2013对C+标准的支持度达以99%,并且支持新标准C+11,所以本书使用Visual Studio 2013作为编译环境。 使用向导新建控制台项目 单击其中的“运行”按钮或按下Ctrl+F5组合键可以运行程序,程序的调试,程序中的错误分为编译错误,逻辑错误和运
13、行时错误 编译错误编译是就能找出来,因为它只是C+程序中的语法错误; 逻辑错误是程序功能上的一些错误,或编译器不能检测出的数组赿界错误; 运行时错误是运行过程中出现的错误,可能是内存没有释放可文件不能打开等错误。 单步调试是逐语句调试 断点调试,1.6 本章小结,(1)本章主要讲述了面向对象程序设计的思想与概念 (2)面向对象程序设计的方法。 (3)C+中输入输出的使用及C+的面向对象程序与面向过程程序的区别与联系。 (4)最后重点讲了C+程序的断点调试和单步调试。,2.1 C+数据类型 2.2 变量与常量 2.3 运算符与表达式 2.4 控制结构 2.5 数组 2.6 函数,第2章 C+基础
14、知识,2.7 结构体 2.8 联合体 2.9 指针 2.10 面向过程程序设计规范 2.11 菜单结构的设计与实现 2.12 本章小结,返回目录,2.1 C+数据类型,C+字符集,C+字符集,字母: az;AZ 数字: 0 1 2 3 4 5 6 7 8 9 其他符号: + - * / = , . _ : ; ? | ! # % int,int ,程序举例,void swap(int ,/函数的定义 void swap(int ,程序举例,int vals10;/定义的全局数组变量 int error = -1; int max = 0; int ,/*功能:返回x,y中的较大数*/ int
15、,返回目录,2.2 变量与常量,标识符与关键字,标识符:程序或系统定义的符号 用来作为变量名、常量名、函数名、类型名、文件名等。 由字母、数字、下划线组成,且由字母或下划线开头的字符串,中间不能有空格 _sum, sum, stu_name, price等为合法的标识符。 cout,52select,a lot,-W,sin 等为不合法标注符。 关键字:也称保留字 是C+编译器预定义的、具有固定含义的标识符,不允许另作它用,常用关键字,变量的定义与初始化,变量定义的语法: 变量的类型变量的名称; 初始化的方法 int a=; intb(1); int c;c=1;,常量与符号常量,常量通过关键
16、字const来定义 语法规则 const 变量类型变量名称; 或 const 变量类型变量名称=初始值; 如: const double pi=3.14;,返回目录,2.3 运算符与表达式,运算符,查看详情,1.算术运算符:+、-、*、 /、 %、+、- 2.赋值运算符:= 、+=、-= 、*= 、/=、%= 3.关系运算符:=、= 、!= 4.逻辑运算符:! 、 else if (条件表达式2) 语句2; else if (条件表达式n) 语句n; else 语句n+1;,单分支结构: if(条件表达式) 语句1; 双分支结构: if(条件表达式) 语句1; else 语句2; switch
17、语句 switch(判断表达式) case 常量表达式1: 语句1; break; case常量表达式2: 语句2; break; / default: 语句n+1; ,循环结构,三要素: 循环变量、循环体和循环终止条件 循环结构 for循环的一般结构 for(表达式1; 表达式2; 表达式3) 语句; while循环的一般结构 while (表达式) 语句; do-while循环的一般结构 do 语句; while (表达式);,程序举例,程序2-7:计算这一天是这一年的第几天,int monthDays = 0, 30, 28, 31, 30, 31, 30, 31, 31, 30, 31
18、, 30, 31 ; int main() int year, month, day; cout year month day; int sumDays = day;/总天数 for (int i = 1; i month; i+) /忽略闰年 sumDays = sumDays + monthDaysi; cout year - month - day is cout year 年的第 sumDays 天n; system(pause);return 0; ,程序举例,程序2-8:输入两个整数m,n,计算其最大公约数,int main() int a, b; cout a b; int m
19、= a, n = b; int r = m%n; while (r != 0) m = n;n = r;r = m%n; cout a , b 的最大公约数是: n endl; system(pause);return 0; ,程序举例,程序2-9:用公式求的近似值,直到最后一项的绝对值小于10-8为止。,#include #include #include using namespace std; int main() double s = 0, t = 1; int sgn = 1, k = 1;,do s = s + t; k = k + 2; sgn = sgn*(-1); t = s
20、gn / double(k); while (fabs(t) 1e-8); cout setprecision(15) s * 4 endl; system(pause); return 0; ,返回目录,2.5 数组,一维数组,概念: 同一类型的多个数据分配一段连续的内存空间 定义: 数据元素类型数组变量名称数组元素的个数; 数据元素类型数组变量名称=初值,初值,.; 初始化: 全部初化,int a=1,2,3,4,5,6; 部分初始化,int a5=1,2,3,; 访问: 下标运算符,数组名下标,程序举例:数组使用,#include #include using namespace std
21、; int main() /数组逆置处理 int myArray = 1, 2, 3, 4, 5 ; int n = sizeof(myArray) / sizeof(myArray0);/计算数组元素的个数 int i, j,tmp; for (i = 0, j = n - 1; i j; i+, j-) tmp = myArrayi; myArrayi = myArrayj; myArrayj = tmp; for (i = 0; i n; i+) cout setw(5) myArrayi; cout endl; system(pause); return 0; ,二维数组,概念:数组的
22、元素又是数组,可看作矩阵 定义: 数据元素类型数组变量名称数组元素的行数数据元素的列数; 数据元素类型数组变量名称数据元素的列数=初值,初值,.; 初始化 分行初始化:例 int a3=1,4,5; 不分行初始化:例 int a3=1,2,3,4,5; 访问: 数组名下标下标,程序举例:设计二维数组程序,输出九九乘法表:,#include #include #include using namespace std; #define COL 10 #define COLUMN 10 int main() int mat COLCOLUMN = 0 ; int i, j; for (i = 1;
23、i COL; i+) /矩阵元素赋值,乘法表 for (j = 1; j = i; j+) mat ij = i*j; for (i = 1; i COL; i+) /输出乘法表 for (j = 1; j = i; j+) cout setw(3) j * i = mat ij; cout endl; ,/将结果写到文件中 ofstream outFile(res.txt);/定义输出文件流 for (i = 1; i COL; i+) for (j = 1; j = i; j+) /将结果写到输出文件流中 outFile setw(3) j * i = mat ij; outFile en
24、dl; outFile endl; outFile.close();/关闭输出文件流 fflush(stdin);/清空输入缓冲区 getchar(); return 0; ,字符数组和字符串类,概念: 数组的每一个元素均为字符类型 定义: char 字符数组名称字符数组最多存放的字符元素个数; char *字符指针名=new charN; string 字符串变量名;,程序举例:将数字字符串变为数字,#include #include/C+字符串,是类类型 using namespace std; int main() string numStr; long int number = 0;
25、int singleNum; cout numStr; int i = 0;,while (numStri != 0) /将单个字符变为数字,48是0的ASC码值 singleNum = numStr.at(i) - 48; number = number * 10 + singleNum; i+; cout numStr= numStr endl; cout number= number endl; fflush(stdin); getchar(); return 0; ,返回目录,2.6 函数,函数的定义,概念: 实现某一功能的相关语句组织在一起,并给之注明相应的名称,这种形式的组合就称为
26、函数 功能:C+程序的基本模块,函数组成C+程序 至少含有一个main函数 main是程序运行的入口 分类: 是否为系统预定义,分为库函数和用户自定义函数 是否有参:有参函数和无参函数,函数原型的声明,编译器遇到一个函数调用时,需要判断该函数调用是否正确,该机制即函数原型。 C+中,函数声明就是函数原型 函数原型的声明 函数原型是一条程序语句,它必须以“;”分号结束; 由函数返回类型、函数名和参数表构成 函数返回值类型 函数名(); int area(int,int); int area(int length,int width); 函数原型和函数定义在返回类型、函数名和参数表上必须完全一致,
27、函数的调用,直接调用 适用于函数的返回值为空,或返回值不需要被保存的情况 表达式调用 将函数调用放到一个表达式中,让其参与运算 一般用在赋值表达式中 y=sin(x); 嵌套调用 一个函数调用的结果作另一个函数调用的参数 m=max(a,max(b,c); 参数传递 传值 传引用 传地址,C+的函数调用过程就是栈空间操作的过程 (1)建立被调函数的栈空间; (2)保护调用函数的运行状态和返回地址; (3)传递参数; (4)将控制权转交给被调函数; (5)函数运行完成后,复制返回值到函数数据块的底部; (6)恢复调用函数的运行状态; (7)返回到调用函数。,分析程序的执行过程,int funcA
28、(int x, int y); int main( ) int a=6, b=12; a=funcA(a, b); int funcA(int x, int y) int n=5; n=x+y; return n; ,运行程序,执行main( ),调用函数funcA(a, b),main函数的临时空间,调用函数funcA(a, b), 执行n=x+y;,调用函数funcA(a, b),执行return n;,返回到main( )函数中,a=funcA(a, b);,内联函数,内联扩展(inline expansion)简称为内联(inline),内联函数也称为内嵌函数 函数的定义或声明前加上关
29、键字inline 一个函数定义为内联函数后,在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,由此省去函数调用的空间分配、保存现场、参数传递和返回操作等,从而加快整个程序的执行速度 内联函数可以在一开始仅定义或声明一次,但必须在函数被调用之前定义或声明,函数的重载,功能相似而参数类型不同的函数可以使用相同的函数名,这就是函数重载 参数类型不同 void sort(int *arr,int n); void sort(float*arr,int n); 参数个数不同 int max(int a,int b); int max(int a,int b,int c); 参
30、数顺序不同 void find(float *arr,int n,float x); void find(float *arr,float x,int n);,#include using namespace std; int ABS(int); double ABS(double); float ABS(float); int main() int x1=-12; double x2=-12.0; float x3=-12.0; coutABS(x1)endl; coutABS(x2)endl; coutABS(x3)endl; ,int ABS(int a) return (a0?a:-a
31、); double ABS(double a) return (a0?a:-a); float ABS(float a) return (a0?a:-a); ,程序举例:返回一个数的绝对值,只要参数个数不同,参数类型不同,参数顺序不同,函数就可以重载。然而,只是返回类型不同则不允许重载。 void func(int a); void func(char a); void func(char a, int b); void func(int a, char b); char func(int a); ,C+按下列三个步骤的先后顺序找到匹配的函数并调用之。 寻找一个严格匹配,如果找到了,就调用那个
32、函数。 通过相容类型的隐式转换寻求一个匹配。 通过用户定义的转换寻求一个匹配,若能查出唯一的一组转换,就用那个函数。,#include using namespace std; void print(int); void print(double); int main() print(1); print(1.0); print(a); print(3.14f); ,输出: int: 1 double: 1 int: 97 double: 3.14,void print(int a) coutint: aendl; void print(double a) coutdouble: aendl;,
33、程序举例:编程求圆、矩形、梯形的面积,double area(double r) return 3.14*r*r; double area(double h,double w) return h*w; double area(double a,double b,double h) return (a+b)*h/2;,#include using namespace std; double area(double r); double area(double h,double w); double area(double a,double b,double h); int main() doub
34、le r=23.3; double h1=12,w=5, a=7,b=8, h2=3; coutarea(r)endl; coutarea(h1,w)endl; coutarea(a,b,h2); ,带缺省值的函数,C+可以给函数声明中的参数使用默认值,这样在函数调用时,对应的实参就可以省略。 #include using namespace std; int func(int a=2); int main() coutfunc(5)endl; coutfunc()endl; int func(int a) return a; ,默认参数规则,一般来说,默认参数总是在函数声明时描述。 函数参数
35、默认值只能从后往前设置,而实参只能从前往后给出。 例: void func(int a=1, int b, int c=3); void func(int a, int b=2, int c=3); func(10,15,20); func( ); func(12,13); func(2, , 20); ,递归函数,在函数体中出现调用自身的函数称为递归函数。 例:阶乘n!的数学函数描述为 其对应的C+函数描述为: unsigned f(unsigned n) if(n=1) return 1; return n*f(n-1); 注意:n的取值范围1n12,例:Fibonacci数列的数学描述为
36、 其等价的C+函数为: unsigned int f(unsigned int n) if(n=0|n=1) return n; return f(n-1)+f(n-2); n的取值范围1n46,递归函数,递归函数在运行中,其调用与被调函数的指令代码是同一个函数副本,只不过各个不同运行中的调用点,作为状态的一部分,在栈中被分别保护起来。因此,是C+的函数机制决定了递归操作的可能性与形式。,递归函数,例:n!的函数,当调用f(3)时,其运行栈描述如图所示,递归条件,递归不能无限制地调用下去,因为栈空间是有限的,所以递归函数是有条件地调用自身。例如阶乘函数中的“if(n=1) return 1;”
37、当n为1时,函数就不再递归了。 递归函数就有递归调用语句,且递归调用应有参数,参数值应该是逐渐逼近停止条件。例如f(n-1)相对f(n)来说,是逐渐逼近了停止条件。 递归条件应先测试,后递归调用。无条件递归的逻辑错误,编译器是检查不出来的。,返回目录,2.7 结构体,概念:结构体则是任意类型元素的一个聚集,把类型不一样的一组数据放到一块连续的内存空间 结构体类型的定义: struct 结构体类型名称 数据类型1成员名称; 数据类型2成员名称; . ; 结构体变量的定义 结构体类型名称 结构体变量的名称; 结构体成员的访问 结构体变量名.结构体成员名,程序举例:结构体类型的定义,数组,指针的综合
38、应用,#include #include using namespace std; /Point类型结构体的定义 struct Point int x, y; ; /函数原型的声明 void inputPoint(Point *poly, int n); void outputPoint(Point *poly, int n);,int main() Point polygon5;/定义五边形 int n = sizeof(polygon) / sizeof(polygon0); inputPoint(polygon, n); outputPoint(polygon, n); fflush(s
39、tdin); getchar(); return 0; ,/输入结构体数组元素的值 void inputPoint(Point *poly, int n) cout polyi.x polyi.y; ,/输出Point结构体元素的值 void outputPoint(Point *poly, int n) cout x y ) endl; ,返回目录,2.8 联合体,概念:union可以用相同的存储空间存储不同类别的数据类型,从而节省内存空间 所有成员相对于基地址的偏移量都为0 联合体(union)中的各变量是“互斥”的 联合类型的定义形式 union 联合类型名 数据类型1成员名称; 数据类
40、型2成员名称; . ;,程序举例:联合体类型的定义与应用,typedef union char a; int b; double c; Demo; int main() char ch=H; int i = 5; double c = 3.14; cout ch 占 sizeof(ch) 个字节n; cout i 占 sizeof(i) 个字节n; cout c 占 sizeof(c) 个字节nn;,Demo d; cout Demo 类型 变量d 占 sizeof(d) 个字节n; d.a = ch; cout d.a= d.a endl; d.b = i; cout d.b= d.b en
41、dl; d.c = c; cout d.c= d.c endl; cout a= d.a b= d.b c= d.c endl; system(pause); return 0; ,返回目录,2.9 指针,指针的定义与使用,程序运行中的每一个变量都分配有一块内存空间,对应的内存的起始编号称为这个变量的地址 直接访问:程序通过变量名来访问这块空间中的数据的访问方式 指针变量:保存另一个变量地址的变量 间接访问:通过指针变量来访问它所存的变量的方式 多级指针:若指针变量所指向的变量的类型是指针类型 指针变量的定义格式 一级指针定义:数据类型 *变量名; 二级指针定义:数据类型 *变量名; 三级指针
42、定义:数据类型 *变量名;,程序举例:一级指针的简单使用,int main() int num1 = 3; /定义整型变量的指针,并初始化指针变量的地址为num1的地址 int *pointer = ,指针变量的基本操作,指针变量初始化与赋值的语法格式 数据类型 *指针变量=初始地址表达式; 指针变量赋值 指针变量名=地址表达式; 其他运算 取值运算:* 算术运算:+n,-n 相减运算:p1-p2 比较运算:p1p2,程序举例:指针的各种运算,通过数组中地址的运算呈现,#include #include using namespace std; void output(int *arr, in
43、t n); int main() int intArray = 1, 2, 3, 4, 5 ; int n = sizeof(intArray) / sizeof(intArray0); output(intArray, n);/数组名作函数的参数 int *pPointer = intArray; int i = 0; while (pPointerintArray + n)/指针的+n运算 *pPointer = i * 2 + 1; pPointer+;/指针的+运算 i+; ,pPointer = intArray; output(pPointer, n);/指针作函数的能数 syst
44、em(pause); return 0; /倒序输出数组元素值 void output(int *arr, int n) int *p; p = arr + n - 1;/指向数组元素的指针 for (; p = arr; p-)/指针-运算 cout setw(3) *p; cout endl; ,动态内存分配,运行的程序的内存空间内存分成5个区 全局数据区(datat area),代码区(code area),栈区(stack area)、堆区(heap area)、字符串常量区 程序运行过程中才能确定数据大小时,需要根据问题的规模动态分配 动态地分配内存new运算符 指针变量名=new
45、类型名(初值列表); 指针变量名=new 类型名下标表达式; 指针变量=new 类型名下标表达式1 下标表达式2 .; 内存释放delete delete 指针变量名; delete 指针变量名;,程序举例:动态申请一维数组,int *NewArray(int n); /动态申请一维数组的内存空间 void output(int *arr, int n); /显示数组元素的值 int main() int n; cout n; int *array = NewArray(n); for (int i = 0; in; i+) arrayi = i; output(array, n); dele
46、tearray; system(pause);return 0; ,/动态申请一维数组的内存空间 int *NewArray(int n) int *p; p = new intn; return p; /显示数组元素的值 void output(int *arr, int n) int *pointerArr = arr; for (; pointerArrarr + n; pointerArr+) cout *pointerArr; cout endl; ,指针与函数,指针作函数的参数 指针作函数的参数是一种地址传递方式 指针可以作为函数的形参,也可以作为函数的实参 实参和形参指针变量指向
47、同一内存地址,实现参数双向传递 指针函数:指针类型函数 函数声明其返回值为指针类型时,这个函数就称为指针型函数 主要目的就是要在函数调用结束时把大量的数据从被调用函数返回到主调函数 指针函数定义: 数据类型 *函数名(参数表)函数体 函数指针:函数指针就是用来存储函数的入口地址的指针变量 函数的指针定义格式:返回类型 (*函数指针名)(形式参数表); 函数指针赋值:函数指针名=函数名; 调用函数指针指向的函数:函数指针名(实参表);,程序举例:使用函数指针实现各类函数的调用,#include #include using namespace std; #define FUN_MAX 0 #define FUN_MIN 1 #define SIZE sizeof(map)/sizeof(fun_map) string menu = 计算两数的最大值,输入0, 计算两数的最小值,输入1 ; int max(int x, int y); int min(int x, int y); void