第2章VC程序设计基础变量与函数47080

上传人:工**** 文档编号:570075711 上传时间:2024-08-01 格式:PPT 页数:63 大小:586.50KB
返回 下载 相关 举报
第2章VC程序设计基础变量与函数47080_第1页
第1页 / 共63页
第2章VC程序设计基础变量与函数47080_第2页
第2页 / 共63页
第2章VC程序设计基础变量与函数47080_第3页
第3页 / 共63页
第2章VC程序设计基础变量与函数47080_第4页
第4页 / 共63页
第2章VC程序设计基础变量与函数47080_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《第2章VC程序设计基础变量与函数47080》由会员分享,可在线阅读,更多相关《第2章VC程序设计基础变量与函数47080(63页珍藏版)》请在金锄头文库上搜索。

1、第第2章章 VC程序基础程序基础数据类型、常量、变量与函数数据类型、常量、变量与函数 2.1 2.1 数据类型数据类型 2.2 2.2 常量常量 2.2.3 3 变量的生存期与作用域变量的生存期与作用域 2.2.4 4 指针与引用指针与引用 2.2.5 5 函数的声明与调用函数的声明与调用 2.2.6 6 函数参数的传递函数参数的传递2024/8/112.1 VC中的数据类型中的数据类型 VC提供了丰富的数据类型,主要包括提供了丰富的数据类型,主要包括基本类型基本类型和和非基本类型非基本类型基本类型基本类型主要包括主要包括char(字符型)、字符型)、int(整型)、整型)、shor(短整短整

2、型)、型)、long(长整型)、长整型)、bool(逻辑型)、逻辑型)、float(单单 精度实精度实数)、数)、double(双精度实数双精度实数)等。等。非基本类型非基本类型主要包括枚举型(用主要包括枚举型(用enum定义)、数组型、指针定义)、数组型、指针型、空类型(型、空类型(void)、)、结构体类型(用结构体类型(用struct定义)、公用体定义)、公用体类型(用类型(用union定义)和下一章要讲的类类型(用定义)和下一章要讲的类类型(用class定义)定义)2024/8/12数据类型转换数据类型转换自动类型转换自动类型转换 1) 在双目运算中在双目运算中:不同类型的数据在运算前

3、要统一类型不同类型的数据在运算前要统一类型,一一般是低类型向高类型作类型转换般是低类型向高类型作类型转换. double int - unsigned- long- double 2)当其它类型的数参与逻辑运算时,按照:值为非)当其它类型的数参与逻辑运算时,按照:值为非0,为,为true;值为;值为0,为,为false. 3)赋值运算则将右值按左值类型转换)赋值运算则将右值按左值类型转换使用强制类型转换符使用强制类型转换符 例如例如: float a=3.14; int b; b=(int)a; 则则b为为32024/8/132.2 常量常量常量常量:程序运行中其值保持不变的程序运行中其值保持

4、不变的,称为常称为常量量.定义方法定义方法: #define pi 3.1415926 const double pi=3.1415926; const int size=80;2024/8/142.3 变量的生存期与作用域变量的生存期与作用域2.1.1 2.1.1 变量的五要素变量的五要素2.1.2 2.1.2 VCVC程序的存储组织程序的存储组织 2.1.3 2.1.3 变量作用域及其分类变量作用域及其分类 2.1.4 2.1.4 一个一个VCVC多文件应用程序的实现多文件应用程序的实现2.1.5 2.1.5 变量生存期及其分类变量生存期及其分类 2024/8/152.3.1变量的五要素1

5、 1变量的名称变量的名称2 2变量的数据类型变量的数据类型3 3变量的值变量的值4 4变量的地址变量的地址5 5变量的存储类型变量的存储类型2024/8/162.3.2 VC程序的存储组织 一个一个VCVC程序编译运行后,将其对应的目标程序编译运行后,将其对应的目标代码调到内存中。代码调到内存中。目标代码主要包含目标代码主要包含操作符操作符和和操作数操作数,其中操作符存放在其中操作符存放在代码区代码区,程序中处理的数据,程序中处理的数据(操作数)分别存放在(操作数)分别存放在静态存储区静态存储区和和动态存储区动态存储区。 一个一个VCVC程序可以使用的存储空间分为如下程序可以使用的存储空间分为

6、如下三个部分三个部分: 代码区代码区 静态存储区静态存储区 动态存储区动态存储区 2024/8/17 变变量量的的作作用用域域是是指指在在程程序序中中变变量量的的有有效效区区域域,它它是是变变量量的的活活动动空空间间。在在VCVC中中,变变量量的的作作用用域域有有六六种种,从从其其作作用用范范围围的的大大小小由由小小到到大大依依次次为为:块块作作用用域域、函函数数作作用用域域、类类作作用用域域、命命名名空空间间作作用用域域、文文件件作作用用域域、程程序序作作用用域域。变变量的作用域取决于变量的位置与声明的方式。量的作用域取决于变量的位置与声明的方式。2.3.3 变量作用域及其分类 2024/8

7、/181块作用域 块块指指的的是是由由一一对对“”“”、“”“”括括起起来来的的程程序序段段。在在块块中中声声明明的的变变量量具具有有块块作作用用域域,其其作作用用域域从从声声明明处处开开始始,一一直直到到块块结结束束的的花花括括号号为为止止。复复合合语语句句也也是是一一个个块块,例例如如ifif语语句句中中定定义义的的变变量量只只能能在在ifif语语句句中中使使用用,forfor语语句句中中定定义义的的变变量量,包包括括括括号号表表达达式式中定义的变量,只能在中定义的变量,只能在forfor语句中使用。语句中使用。 下面演示块作用域的实例:下面演示块作用域的实例: 2024/8/19【例例2

8、-12-1】演示块作用域的实例:输入两个数将】演示块作用域的实例:输入两个数将由大到小的顺序保存,并输出结果由大到小的顺序保存,并输出结果 # #include include iostream.hiostream.h #include #include void main()void main() intint x,y; x,y;coutcout请输入两个整数:请输入两个整数:xy;xy;if(x=y) /xif(x=y) /x中保存较大的数,中保存较大的数,y y中保存较小的数中保存较小的数 intint t; /t t; /t为临时变量,其作用域为块作用域为临时变量,其作用域为块作用域t

9、=x; /t=x; /交换交换x x与与y y的值的值x=y;x=y;y=t;y=t; coutcoutx=setw(6)xy=setw(6)yx=setw(6)xy=setw(6)yendlendl; ; /setw(6)/setw(6)设置显示的宽度为设置显示的宽度为6 6个字符个字符 2024/8/1102函数作用域函函数数作作用用域域是是在在某某个个函函数数内内起起作作用用,例例如如函函数数的的形形式式参参数数具具有有函函数数作作用用域域,它它们们起起始始于于函函数数体体开开始始的的第第一一个个左左花花括括号号“”“”,结结束束于于标标志志函函数数体结束的最后一个右花括号体结束的最后一

10、个右花括号“”“”。可可以以说说函函数数作作用用域域是是一一种种特特殊殊的的块块作作用用域域。一一个个函函数数内内可可以以有有多多个个块块,因因此此函函数数作作用用域域大大于于块块作用域作用域。2024/8/111【例例2-22-2】演示函数作用域的实例:将一个整数的】演示函数作用域的实例:将一个整数的各个位上的数字加起来(用函数完成),并输出各个位上的数字加起来(用函数完成),并输出结果。结果。 #include #include iostream.hiostream.h #include #include intint SumDigits(SumDigits(intint x x) /x)

11、 /x为形式参数,其作用域为该函数,在该函数外不可访问为形式参数,其作用域为该函数,在该函数外不可访问 intint sum=0; /x sum=0; /x为函数内定义的变量,其作用域为该函数为函数内定义的变量,其作用域为该函数while(x)while(x) sum+=x%10; /sum+=x%10; /求个位数字求个位数字x/=10; /x/=10; /原数字缩小原数字缩小1010倍倍 return sum; /sumreturn sum; /sum保存各位数字之和保存各位数字之和 void main()void main() intint a; a;coutcout请输入一个整数:请输

12、入一个整数:a;a;coutcoutSumDigits(aSumDigits(a)n; /)n; /输出各位数字之和输出各位数字之和 2024/8/1123类作用域 下下一一章章要要讲讲类类与与对对象象,在在类类中中包包含含成成员员变变量量与与成成员员函函数数。一一个个类类中中的的成成员员变变量量在在该该类类的的任任何何成成员员函函数数中中都都可可以以访访问问,因因此此类类的的作作用用域域是是整整个个类类的的定定义空间。义空间。4命名空间域 一一个个工工程程中中的的多多个个文文件件中中有有可可能能存存在在相相同同的的变变量量,为为了了区区别别这这些些变变量量, ,可可以以将将在在不不同同文文件

13、件中中的的相相同同变变量量防防到到放放到到两两个个不不同同命命名名空空间间中中,通通过过命命名名空空间间来来确确定定变变量量作作用用范范围围的的作作用用区区域叫域叫命名空间作用域命名空间作用域。该小节请查阅相关资料。该小节请查阅相关资料。2024/8/1135文件作用域在在函函数数(以以及及下下一一章章要要讲讲的的类类)以以外外声声明明的的、并并且且用用“static”修修饰饰的的变变量量,具具有有文文件件作作用用域域。其其作作用用域域起起始始于于变变量量的的声声明明处处,终终止止于于文文件件的的结结束束处处,具具有有该该作作用用域域的的变变量量又又称称全全局局变变量量。该该种种类类型型的的变

14、变量量仅仅仅仅在在该该文文件件中中是是全全局的局的,别的文件不能使用。,别的文件不能使用。文件作用域又叫单文件作用域。文件作用域又叫单文件作用域。2024/8/114【例2-3】文件作用域的实例。本程序定义了一个全局变量x,其作用域为整个文件。 # #include include iostream.hiostream.h #include #include static static intint x=6903410; x=6903410; void void Swap(intSwap(int x,intx,int y) y) /利利用用加法完成两个数的交换加法完成两个数的交换 x=x+y;

15、 x=x+y; /此此处处的的x x与与y y为为函函数数作作用域用域y=x-y;y=x-y;x=x-y;x=x-y;coutcoutSwap()Swap()函函 数数 中中 的的 x x为为xxendlendl; ;:x:x+; +; /文文件件作作用用域域的的变变量量x x加加1 1 void main()void main() intint x x; ;coutcout请请 输输 入入 一一 个个 整整 数数 :x x; ;+x;/main+x;/main函数中的函数中的x x加加1 1coutcoutmain()main()函函 数数 中中 的的 x x值值 为为xxendlendl;

16、 ;coutcout文文 件件 作作 用用 域域 的的 的的 x x为为:x xendlendl; ;Swap(Swap(x x,10);,10);coutcout调调用用SwapSwap后后文文件件作作用用域域的的的的x x为为:x xendlendl; ; 2024/8/1156程序作用域 如如果果一一个个变变量量的的存存储储类类别别为为外外部部(extern)类类型型,则则称称该该变变量量为为外外部部变变量量。外外部部变变量量带带有有赋赋值值的的声声明明称称为为定定义义性性说说明明,外部变量不带有赋值的声明称为,外部变量不带有赋值的声明称为引用性说明引用性说明。extern char c

17、hoice=y; /extern char choice=y; /定义性声明定义性声明extern float money ; /extern float money ; /引用性声明引用性声明定定义义性性声声明明指指示示编编译译器器程程序序为为该该外外部部变变量量分分配配内内存存,而而引引用用性性声声明明仅仅告告诉诉编编译译程程序序该该名名字字的的变变量量在在程程序序的的其其它它地地方方已经有了定义性声明已经有了定义性声明。外外部部变变量量是是全全局局变变量量、动动态态生生存存期期变变量量,所所以以其其作作用用域域大大、寿命长。寿命长。2024/8/1162.3.4 一个一个VC多文件应用多

18、文件应用程序的实现程序的实现 在在大大型型复复杂杂的的应应用用程程序序中中,一一个个任任务务常常常常划划分分成成多多个个模模块块,每每个个模模块块是是由由不不同同的的人人员员编编写写,当当然然不不同同的的人人编编制制的的代代码码应应放放在在不不同同的的文文件件中中,最最后后要要把把这这些些文文件件统统一一起起来来,放放到到一一个个工工程程中中。此此时时,在在自自己己的的文文件件中中如如何何访访问问别别的的文文件件中中的的变变量量或或函函数数,又又如如何何控控制制别别人人编编的的文文件件不不能能使使用用自自己己的的变变量呢?量呢?这就牵涉到如何使用这就牵涉到如何使用程序作用域程序作用域的变量。的

19、变量。 2024/8/117【例例2-42-4】建立一个包含多个文件的程序。该工程】建立一个包含多个文件的程序。该工程的名字为的名字为ProgScopeProgScope 1建立一个空的控制台工程建立一个空的控制台工程()单单击击VCVC集集成成开开发发环环境境菜菜单单File|NewFile|New,选选择择ProjectsProjects选选项项。该该选选项项下下列列出出了了VCVC可可以以开开发发的的1717种种应应用用程程序序的的类类型型。我我们们选选择择基基于于字字符符界界面面的的“Win32 Win32 ConsloeConsloe Applications Application

20、s”控制台应用程序类型。如图控制台应用程序类型。如图2.12.1所示。所示。()在在“Project Project NameName”编编辑辑框框内内填填写写工工程程的的名名字字“ProgScopeProgScope”,并并在在“LocationLocation” 编编辑辑框框内内填填写写工工程程所所在在的的目目录录。我我们们选选择择的的是是“E:VCPPE:VCPP”。这这样样,当当最最后后生生成成一一个个应应用用程程序序时时,就就在在E:VCPPE:VCPP的的目目录录在在生生成成一一个个新新目目录录ProgScopeProgScope ,在在“E:VCPP E:VCPP ProgSco

21、peProgScope ”目目录录下下,存放的是与该工程有关的一系列文件。存放的是与该工程有关的一系列文件。()单单击击按按钮钮“OkOk”, ,进进入入到到图图2.22.2所所示示的的界界面面中中。该该界界面面让让用用户户选选择择Win32 Win32 控控制制台台应应用用程程序序的的类类型型。我我们们选选择择第第一一种种“A A empty empty projectproject”。单击单击“FinishFinish”按钮,进入到图按钮,进入到图2.32.3所示的界面。所示的界面。()图图2.32.3是是对对生生成成工工程程总总的的信信息息描描述述,没没多多大大意意义义。单单击击“OKO

22、K”按按钮钮生成生成ProgScopeProgScope应用程序框架。应用程序框架。2024/8/118【例【例2-42-4】建立一个包含多个文件的程序。该】建立一个包含多个文件的程序。该工程工程的名字为的名字为ProgScope图图2.1 2.1 选择应用程序类型对话框选择应用程序类型对话框 2024/8/119【例【例2-42-4】建立一个包含多个文件的程序。该】建立一个包含多个文件的程序。该工程工程的名字为的名字为ProgScope图图2.2 2.2 选择控制台工程类型图选择控制台工程类型图2.3 2.3 生成的控制台工程信息生成的控制台工程信息 2024/8/120【例【例2-42-4

23、】建立一个包含多个文件的程序。】建立一个包含多个文件的程序。该该工程的名字为工程的名字为ProgScope2在工程中增加在工程中增加C+源文件源文件(1) (1) 单单击击File|NewFile|New,选选择择FilesFiles选选项项卡卡,该该选选项项下下列列出出了了VCVC可可以以使使用用的的文文件件类类型型。我我们们选选中中C+ C+ Source Source FileFile列列表表项项,并并在在右右边边的的FileFile编编辑辑框框中中输输入入新新建建单单文文件件C+C+文文件件名名称称File1File1。同同时时选选中中“Add Add toProjecttoProje

24、ct: :”复复选选框框。如如图图2.42.4所所示示。最最后后按按OKOK按按钮钮,返返回回到到Microsoft Microsoft VisuallVisuall C+C+的主窗口,在其中输入如下的程序源代码:的主窗口,在其中输入如下的程序源代码:#include iostream.hextern int File2_x; /引用性声明引用性声明,表示要使用别的文件中的表示要使用别的文件中的File2_x变量变量 void main() coutFile2.cpp中的变量中的变量File2_x=File2_xendl;2024/8/121【例【例2-42-4】建立一个包含多个文件的程序。该

25、】建立一个包含多个文件的程序。该工程工程的名字为的名字为ProgScope(2)用用同同样样的的方方法法在在工工程程ProgScope中中添添加加另另一一个个源源文文件件File2.cpp,该文该文 件中的代码为:件中的代码为:extern extern intint File2_x=222; File2_x=222; /定定义义性性声声明明变变量量File2_xFile2_x,它它是是一一个个程程序序作作用用域域的的变变量量,别别的的文文件件可可以访问它,前面的以访问它,前面的externextern可省略可省略 图图2.4 2.4 在工程中增加源文件在工程中增加源文件File1.cpp F

26、ile1.cpp 2024/8/122【例【例2-42-4】建立一个包含多个文件的程序。该】建立一个包含多个文件的程序。该工程的工程的名字为名字为ProgScope 3运行该工程运行该工程 按按“Ctrl+F5”,VC编编译译器器编编译译、链链接接并并运运行行该程序,程序的运行结果为:该程序,程序的运行结果为: File2.cpp中的变量中的变量File2_x=222 自自己己尝尝试试把把File2.cpp中中的的语语句句“extern int File2_x=222;” 前前的的extern改改为为static,看看程程序序还还能不能运行,并分析原因。能不能运行,并分析原因。2024/8/1

27、232.3.5 变量生存期及其分类变量生存期及其分类 变量的生存期变量的生存期指程序运行过程中变量占用内存或寄存器的时间指程序运行过程中变量占用内存或寄存器的时间它由声明变量时选择的它由声明变量时选择的存储类型存储类型来决定的。来决定的。任任何何一一个个类类型型的的变变量量都都有有自自己己的的生生存存期期,在在生生存存期内,变量将保持它的值不变,直到它被更新止。期内,变量将保持它的值不变,直到它被更新止。变量生存期的分类变量生存期的分类静态生存期静态生存期动态生存期动态生存期2024/8/1242.4 指针与引用 2.2.1 2.2.1 地址与指针的概念地址与指针的概念 2.2.2 2.2.2

28、 指针变量定义与赋值指针变量定义与赋值2.2.3 2.2.3 数组指针与指针数组数组指针与指针数组 2.2.4 2.2.4 动态内存分配:动态内存分配:newnew与与deletedelete2.2.5 2.2.5 引用引用2024/8/1252.4.1地址与指针的概念VC语语言言拥拥有有在在运运行行时时获获得得变变量量地地址址和和操操纵纵地地址址的的能能力力,这这种种可可用用来来操操纵纵地地址址的的变变量量类类型型就就是是指指针针。指指针针可可以以用用于于数数组组,用用于于内内存存访访问问,还还可可作作为为函函数的参数。数的参数。指指针针就就是是地地址址,它它也也是是一一种种数数据据类类型型

29、,具具有有指指针针类类型型的的变变量量称称为为指指针针变变量量。指指针针变变量量也也是是一一个个变变量量,只只不不过过这这个个变变量量是是用用来来放放地地址址的的,是是用用来来存存放别的变量地址的。放别的变量地址的。2024/8/1261指针变量定义指针变量定义 VC中指针变量的定义形式为:中指针变量的定义形式为: 数据类型名数据类型名 * * 指针变量名指针变量名; ;注意:注意:指针的类型为它所指向变量的类型,而不是指针本身指针的类型为它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针的数据值都是数据值的类型,任何一个指针的数据值都是unsigned long unsigned

30、long intint型型。因此指向的类型不同,指针的类型就不同。因此指向的类型不同,指针的类型就不同。2.4.2指针变量定义与赋值例如:例如: int a, *pa; double *p1; POINT *p2; CDC *pDC; 2024/8/1272指针变量的赋指针变量的赋 一个指针变量可以有一个指针变量可以有三种状态三种状态:1) 未未赋赋任任何何值值,“悬悬空空”状状态态(最最严严重重的的错错误误);2) 被赋予被赋予NULLNULL值,(指向一个安全的位置);值,(指向一个安全的位置);3) 指向指向某一个变量(程序员必须用的操作)某一个变量(程序员必须用的操作)。2024/8/

31、1282指针变量的赋值指针变量的赋值 int *ptr;float a=6.6,b,c3 ;float *pa=&a; /声明指针变量声明指针变量pa,并将浮点数并将浮点数a的地址赋给它的地址赋给它float *pb=NULL; /将指针指向安全的位置将指针指向安全的位置float *pc=c; /将数组将数组C的起始地址赋给指针变量的起始地址赋给指针变量pc下面是对一些指针变量赋值的例子:下面是对一些指针变量赋值的例子:2024/8/129【例例2-62-6】指针使用】指针使用实例。实例。 #include iostream.h#include void main()int x,y;int

32、*ptr; /定义指针变量定义指针变量ptry=20;x=10;ptr=&x; /对指针变量对指针变量ptr初始化初始化,使得其指向变量使得其指向变量xcout变变 量量 x的的 值值 为为 decxtptr所所 指指 的的 变变 量量 的的 值值 为为*ptrendl;cout变变 量量 x的的 地地 址址 值值 为为 hex&xtptr的的 值值 为为ptrn;ptr=&y; /对指针变量对指针变量ptr重新赋值重新赋值,使得其指向变量使得其指向变量ycout变变 量量 y的的 值值 为为 decytptr所所 指指 的的 变变 量量 的的 值值 为为*ptrendl;cout变变 量量

33、y的的 地地 址址 值值 为为 hex&ytptr的的 值值 为为ptrn;2024/8/1302.4.3 数组指针与指针数组数组指针与指针数组1 1数组数组 数数学学上上,常常用用一一个个向向量量(vectorvector)表表示示一一些些相相关关数数据据组组成成的的序序列列,在在程程序序设设计计语语言言中中是是用用数数组组来来表表示示的的。数数组组是是由由一一定定数数目目的的同同类类元元素素顺顺序序排排列列而而成成的的结结构构类类型型数数据据(可可把把数数组组看看成成一一种种数数据据类类型型,一一种种复复合合数数据据类类型型)。在在计计算算机机中中,一一个个数数组组在在内内存存中中占占有有

34、一一片片连连续续的的存存储储区区域域,VC的的数数组组名名就就是是这这块存储空间的块存储空间的地址地址。 例如:例如: int score100 ;2024/8/1312 2数组指针数组指针数数组组指指针针是是一一个个指指针针,该该指指针针指指向向的的是是数数据据类类型型是是数数组组类类型型,它它存存放放的的是是数数组组的的起起始始地地址址。其其实实数数组组中中的的每每一一个个元元素素都都是是一一个个变变量量,既既然然是是变变量量,则则他他们们就就具具有有地地址址。C+规规定定,数数组组的的地地址址用用数数组组名名来来表表示示,即即数数组组名名表表示示的的是是第第一个元素的地址一个元素的地址

35、。例如:例如: int(* ArrayPtr)100;2024/8/1322.4.4 动态内存分配:动态内存分配:new与与delete 在在VC中中,动动态态内内存存分分配配技技术术可可以以保保证证我我们们在在程程序序运运行行的的过过程程中中,根根据据实实际际需需要要而而申申请请适适量量的的内内存存,在在使使用用结结束束后后还还可可以以释释放放。这这些些功功能能的的实实现靠现靠newnew和和deletedelete 函数。函数。 1newnew运算运算 运运算算符符newnew的的功功能能是是动动态态分分配配内内存存,或或者者称称为为动动态创建堆对象。其语法形式为:态创建堆对象。其语法形式

36、为:new new 类型名类型名T T(初值列表);初值列表);2024/8/133例如例如:int *pi; /声明指向整型数的指针变量声明指向整型数的指针变量pifloat *pf; /声明指向浮点数的指针变量声明指向浮点数的指针变量pfchar *pc; /声明指向字符的指针变量声明指向字符的指针变量pcpi=new int; /动动态态产产生生一一无无名名的的整整型型变变量量,该该变变量量 的地址保存在指针变量的地址保存在指针变量pi中中pf=new float(13.5); pc=new char3; 2024/8/1342delete运算 运运算算符符new的的功功能能是是动动态态

37、分分配配内内存存,当当用用户户不不再再需需要要这这些些内内存存的的时时候候,必必须须将将其其显显式式地地释释放放,释释放放new所所分分配配空空间间的的函函数数是是delete,其其语语法法形形式为:式为: delete 指针变量名指针变量名;例如:例如:delete *pi; /释放释放pi指向的动态指向的动态int变量变量delete *pf; /释放释放pf指向的动态指向的动态float变量变量delete pc; /释放释放pc指向的动态指向的动态char数组数组2024/8/135【例例2-7】 newnew和和deletedelete实例测试。实例测试。 void main()ch

38、ar *pString1=VC+6.0程序设计简明教程程序设计简明教程; /定义指向字符的指针变量定义指向字符的指针变量puts(pString1); /输出输出pString1所指向的字符串所指向的字符串int *pi; /定义指针变量定义指针变量pipi=new int;/在栈区分配四个字节的空间,起始地址给了在栈区分配四个字节的空间,起始地址给了pi*pi=35; /将将35赋给赋给pi所指向的无名变量所指向的无名变量printf(%8dn,*pi); /输出无名变量的值输出无名变量的值delete pi; /释释放放pi所所指指向向的的无无名名变变量量的的内内存存空空间间,在在用用户户

39、程程序序有有一一个个new一一定定得得有有一个一个deletechar *pString2=new char40; /定定 义义 指指 向向 字字 符符 的的 指指 针针 变变 量量strcpy(pString2,pString1);coutpString2endl;strcat(pString2,-作者:雷惊刘作者:雷惊刘);coutpString2endl;delete pString2;/释放动态字符数组释放动态字符数组pString22024/8/1362.4.5引用引用的概念引用的概念引引用用是是一一个个变变量量的的别别名名,是是一一个个目目标标对对象象的的替替代代名,名,它由符号它

40、由符号&来引导来引导。引引用用类类似似于于一一个个人人的的外外号号,当当给给某某个个人人起起了了一一个个外外号号时时,这这个个外外号号就就是是这这个个人人的的引引用用。因因此此,对对这个人的外号操作,就是对这个人的操作,这个人的外号操作,就是对这个人的操作,类类似似地地,对对一一个个变变量量的的引引用用操操作作,就就是是对对这这个个变变量操作。量操作。2024/8/137【例例2-8】引用实例测试。引用实例测试。 void main()int One=3;int &OneRef=One; /*定定义义引引用用OneRef,同同时时对对其其进进行行初初始始化化为为变变量量One,此此时时OneR

41、ef就是就是One的外号,引用必须在定义时就进行初始化的外号,引用必须在定义时就进行初始化*/coutOne=OnetOneRef= OneRefendl; /输出变量输出变量One与引用与引用OneRef的值,都为的值,都为3One+;/ 变变量量One增增一一,因因此此其其引引用用OneRef也也增增一一,一一个个变变量量和和其其引引用用就是同一个变量。就是同一个变量。coutOne=OnetOneRef= OneRefendl; OneRef=34;/ 对引用对引用OneRef赋值,就是对其引用的变量赋值,就是对其引用的变量One赋值赋值coutOne=OnetOneRef=OneRef

42、endl; 2024/8/138【例例2-8】引用实例测试。引用实例测试。 运行结果为:运行结果为:One=3 OneRef=3One=4 OneRef=4One=34 OneRef=342024/8/1392.5 函数的声明与调用函数的声明与调用2.3.1 2.3.1 函数与模块函数与模块 2.3.2 2.3.2 函数的声明函数的声明2.3.3 2.3.3 函数的定义函数的定义 2.3.4 2.3.4 函数的参数与返回值函数的参数与返回值2.3.5 2.3.5 函数调用函数调用 2024/8/1402.5.1 函数与模块函数与模块 一个程序可以分成多个相互独立的程序段,这些一个程序可以分成多

43、个相互独立的程序段,这些程序段被称为函数程序段被称为函数。函数是一个完成一定功能的。函数是一个完成一定功能的独立执行代码。独立执行代码。当所要执行的程序很大时,需要以一种比较容易管当所要执行的程序很大时,需要以一种比较容易管理的方式来组织源代码,通常是将程序划分为若干理的方式来组织源代码,通常是将程序划分为若干模块。模块。 C+语言使用文件作为划分模块的主要机制,语言使用文件作为划分模块的主要机制,这些组成这些组成C+程序的文件称为程序的文件称为文件模块,文件模块,简称为简称为模模块块。 2024/8/141函数的函数的作用作用有两个有两个:一一是是实实现现任任务务划划分分,将将一一个个比比较

44、较复复杂杂的的任任务务划划分分成成若若干干个个简简单单的的任任务务,每每一一个个任任务务可可以以由由一一个个或或多多个个函函数数组组成成,函函数数的的使使用用,便便于于任任务务的的分分工工与与处理,便于验证程序的正确性;处理,便于验证程序的正确性; 二二是是实实现现软软件件的的源源代代码码复复用用,把把一一些些功功能能相相似似的的程程序序段段组组织织成成函函数数,使使得得函函数数的的代代码码只只有有一一处处,而而调调用用却却可可以以有有多多处处,但但却却不不需需要要编编写写雷雷同同的的代代码。码。2024/8/1422.5.2 函数的声明函数的声明 函函数数和和变变量量一一样样,在在使使用用之

45、之前前应应该该先先声声明明。VC中中一一种种函函数数的的引引用用性性声声明明函函数原型,它的一般形式为:数原型,它的一般形式为: (););2024/8/1432.5.2 函数的声明函数的声明 在在VC中中函函数数必必须须要要有有原原型型,这这是是VC区区别别于于C的的一一个个方方面面。函函数数原原型型的的作作用用是是告告诉诉编编译译器器有有关关函函数数的的信信息息:函函数数的的名名称称、函函数数参参数数的的类类型型、函函数数返返回回值值的的类类型型、函函数数参参数数的的个个数数、函函数数参参数数的的顺顺序序。VC编编译译器器是是根根据据函函数数原原型型来来检检查查函函数数调调用用的正确性。的

46、正确性。 我我们们在在编编写写C+程程序序时时,都都有有大大量量的的#include “ .h”的的字字样样,这这实实质质上上是是一一条条编编译译预预处处理理指指令令。它它把把系系统统定定义义的的函函数数或或自自定定义义的的函函数数包包含含进进来来。切切记记它它只只是是包包含含了了函函数数的的原原型型,真真正正的的函函数数实实现现代代码码并并没没有有包包含含进进来来。编编译译器器根根据据这这些些函函数数的的原原型型来来检检查用户调用是否正确。查用户调用是否正确。 2024/8/1442.5.2 函数的声明函数的声明下下面面为为从从math.h中中抽抽取取出出的的一一段段函函数数原原型型说说明明

47、,从函数的名字可以看出其功能。从函数的名字可以看出其功能。 int _cdecl abs(int);double _cdecl acos(double);double _cdecl asin(double);double _cdecl atan(double);double _cdecl cos(double);double _cdecl exp(double); 2024/8/1452.5.3 函数的定义函数的定义 函函数数的的定定义义包包括括函函数数头头和和函函数数体体两两部部分分。函函数数头头定定义义函函数数的的名名称称、参参数数函函数数返返回回值值类型等,函数体则定义函数的算法实现。类

48、型等,函数体则定义函数的算法实现。函数定义的一般形式是:函数定义的一般形式是: 函数类型函数类型 函数名(数据类型函数名(数据类型1 1 形参形参1 1,数据类型,数据类型2 2 形参形参22) / /函数体函数体 2024/8/1462.5.5 函数调用函数调用 在在VC中中,除除了了主主函函数数外外,其其他他任任何何函函数数都都不不能能单单独独作作为为程程序序运运行行。任任何何函函数数功功能能的的体体现现都都必必须须通通过过主主函函数数直直接接或或间间接调用来进行。接调用来进行。函函数数调调用用就就是是使使程程序序的的流流程程发发生生改改变变,转转去去执执行行指指定定函函数数的的函函数数体

49、体,函函数数调调用用完完成成后后,再再接接着着执执行行调调用用函函数数语语句句的的下一条语句。下一条语句。函数调用的一般格式为:函数调用的一般格式为: 函数名(实参表)函数名(实参表); ;函函数数调调用用时时,要要发发生生实实参参和和形形参参的的结结合合,一一般般实实参参和和形形参参在个数、类型、位置上一一对应。在个数、类型、位置上一一对应。2024/8/147【例例2-102-10】求两个数中的较小数的函数的实例求两个数中的较小数的函数的实例# #include include void main()void main() intint min(intmin(int x,intx,int

50、y); / y); /函数原型说明部分函数原型说明部分coutcoutPlease input two integer:;ab;ab;coutcoutThe The miniumminium number is: min(a,b) number is: min(a,b)endlendl; ; intint min(intmin(int x,intx,int y) / y) /函数定义部分函数定义部分 return xy?x:y;return xy?x:y; 2024/8/1482.4 函数参数的传递 2.4.1 2.4.1 传递方式概述传递方式概述2.4.2 2.4.2 值传递值传递2.4.3

51、 2.4.3 地址传递地址传递 2.4.4 2.4.4 引用传递引用传递 2.4.5 2.4.5 缺省参数缺省参数 2024/8/1492.4.1参数传递方式概述 参参数数是是调调用用函函数数与与被被调调用用函函数数之之间间进进行行通通信信的的桥桥梁梁。函函数数定定义义首首部部的的参参数数称称为为形形参参,调调用用函函数数时时使使用用的的参参数数称称为为实实参参。在在函函数数被被调调用用时时,系系统统建建立立与与实实参参对对应应的的形形参参存存储储空空间间,函函数数执执行行完完毕毕,系系统统收收回回分分配配给给形形参参的的临临时时存存储储空空间间,这这个个过过程程称称为为参参数数传传递递或或参

52、参数数的的虚虚实实结结合合,函函数数通通过过形形参参与实参来进行通信。与实参来进行通信。C+有有种种参参数数传传递递机机制制:值值传传递递、地地址址传传递递、引用传递。引用传递。2024/8/1502.4.2 值传递 值值传传递递又又称称拷拷贝贝传传递递方方式式,顾顾名名思思义义,拷拷贝贝传传递递方方式式就就是是将将实实际际参参数数拷拷贝贝一一份份,传传给给对对应应的的形形参参。由由于于形形参参得得到到的的是是拷拷贝贝的的那那一一份份,它它和和实实参参那那份份是是不不同同的的,即即对对应应形形参参和和实实参参变变量量在在内内存存的的位位置置不不同同,它它们们是是不不同同的的变变量量,唯唯一一共

53、共同同点点是是它它们们的的值值是是一一样样的的。因因此此在在函函数数体体内内对对形形参参的的修修改改,只只是是在在这这个个临临时时建建立立变变量量上上的的修修改改,与与实实参参无无关关。当当函函数数调调用用结结束束后后,形形参参被被释释放放,生生命命期期也也就就结结束束了了,因因此此在在调调用函数中是用函数中是无法修改实参无法修改实参的。的。 2024/8/151【例例2-11】值传递测试。值传递测试。 #include #include iostream.hiostream.h void void SwapByValue(intSwapByValue(int x,intx,int y); /

54、 y); /值传递的交换函数原型说明值传递的交换函数原型说明intint main(intmain(int argcargc, char* , char* argvargv) intint a=6,b=8; a=6,b=8;coutcout未调用函数前未调用函数前a=atb=ba=atb=bendlendl; ;SwapByValue(a,bSwapByValue(a,b); ); coutcout值传递后值传递后a=atb=ba=atb=bendlendl; ;return 0;return 0; void void SwapByValue(intSwapByValue(int x,intx

55、,int y) y) x=x+y;x=x+y;y=x-y;y=x-y;x=x-y; x=x-y; /以上三行代码实现以上三行代码实现x x与与y y的互换的互换coutcout在值传递函数中在值传递函数中x=xty=yx=xty=yendlendl; ; 2024/8/152【例例2-11】值传递测试。值传递测试。 程序的运行结果是:程序的运行结果是:未调用函数前未调用函数前a=6 b=8在值传递函数中在值传递函数中x=8 y=6值传递后值传递后a=6 b=8 程序分析:程序分析: main()函函数数调调用用SwapByValue函函数数时时,系系统统在在栈栈区区开开辟辟空空间间给给变变量量

56、x与与y,把把实实际际参参数数a与与b的的值值赋赋给给x与与y,此此时时x与与y是是6与与8,当当执执行行了了交交换换函函数数的的前前三三条条语语句句后后,x变变成成了了8,y变变成成了了6,最最后后一一条条输输出出语语句句的的运运行行结结果果说说明明了了这这一一点点。SwapByValue函函数数交交换换的的只只是是x与与y,与与a和和b没没有有关关系系,main()函函数数输输出出a与与b的值见证了这一点。的值见证了这一点。 2024/8/1532.4.3 地址传递地址传递 指指针针传传递递是是通通过过函函数数定定义义中中的的形形参参被被说说明明为为指指针针类类型型来来加加以以实实现现的的

57、。由由于于形形参参被被说说明明为为指指针针类类型型,根根据据实实参参向向形形参参传传递递的的三三个个一一致致“参参数数的的类类型型一一致致、个个数数一一致致、顺顺序序一一致致”规规则则,形形参参对对应应的的实实参应为地址表达式参应为地址表达式,即某个变量的地址。,即某个变量的地址。调调用用函函数数时时,实实参参把把变变量量的的地地址址赋赋给给了了形形参参这这个个指指针针变变量量。在在被被调调用用函函数数中中往往往往通通过过指指针针变变量量间间接接访访问问实实参参所所指指的的变变量量,这这种种把把变变量量地地址址传传给给形形参指针变量的方式称为参指针变量的方式称为地址传递或地址调用。地址传递或地

58、址调用。 2024/8/154【例例2-122-12】地】地址址传递测试。传递测试。 #include #include iostream.hiostream.h void void SwapByRefer(intSwapByRefer(int * *x,intx,int *y); / *y); /引用传递的交换函数的原型说明引用传递的交换函数的原型说明intint main(intmain(int argcargc, char* , char* argvargv) intint a=6,b=8; a=6,b=8;coutcout未调用函数前未调用函数前a=atb=ba=atb=bendlen

59、dl; ;SwapByRefer(&a,&bSwapByRefer(&a,&b); ); coutcout引用传递后引用传递后a=atb=ba=atb=bendlendl; ;return 0;return 0; void void SwapByRefer(intSwapByRefer(int * *x,intx,int *y) *y) intint a=* a=*x;intx;int b=*y; b=*y;a=a=a+ba+b; ;b=a-b;b=a-b;a=a-b; a=a-b; /以上三行代码实现以上三行代码实现x x引用与引用与y y引用的互换引用的互换coutcout在引用传递函数中

60、在引用传递函数中a=atb=ba=atb=bendlendl; ; 2024/8/155【例例2-122-12】地址】地址传递测试。传递测试。 程序的运行结果是:程序的运行结果是:未调用函数前未调用函数前a=6 b=8在引用传递函数中在引用传递函数中x=8 y=6引用传递后引用传递后a=8 b=6 2024/8/1562.4.4 引用传递引用传递 引引用用的的实实质质是是给给变变量量其其了了一一个个别别名名,这这样样,当当形形参参和和实实参参结结合合时时,对对应应的的形形参参就就是是相相应应实实参参的的别别名名。在在调调用用函函数数内内对对形形参参的的修修改改就就是是对对实实参参的的修修改改,

61、在在调调用用函函数数外外对对实实参参的的修修改改,当当进进入入被被调调用用函函数数内内时时,相相应应的的形形参参就就是是已已经经修修改改了了的的实实参参。因因此此引引用用传传递递的的理理解解比比较较简简单单,形形参参和和实实参参在在操操作作的的结结果果是是同同步步的,的,形参的值就是实参的值形参的值就是实参的值。当当C+函函数数的的形形式式参参数数被被定定义义为为引引用用类类型型,称称为为引引用用参参数数。引引用用参参数数对对应应的的实实际际参参数数为为一一个个变变量量或或对对象象。函函数数被被调调用用时时,形形参参不不需需要要开开辟辟新新的的存存储储空空间间,形形参参名作为引用绑定到实参上,

62、名作为引用绑定到实参上,即形参变为实参的别名即形参变为实参的别名。2024/8/157【例例2-13】引用】引用传递测试。传递测试。 void void SwapByRefer(intSwapByRefer(int & &x,intx,int &y); / &y); /引用传递的交换函数的原型说明引用传递的交换函数的原型说明intint main(intmain(int argcargc, char* , char* argvargv) intint a=6,b=8; a=6,b=8;coutcout未调用函数前未调用函数前a=atb=ba=atb=bendlendl; ;SwapByRefe

63、r(a,bSwapByRefer(a,b); ); coutcout引用传递后引用传递后a=atb=ba=atb=bendlendl; ;return 0;return 0; void void SwapByRefer(intSwapByRefer(int & &x,intx,int &y) &y) x=x+y;x=x+y;y=x-y;y=x-y;x=x-y; x=x-y; /以上三行代码实现以上三行代码实现x x引用与引用与y y引用的互换引用的互换coutcout在引用传递函数中在引用传递函数中x=xty=yx=xty=yendlendl; ; 2024/8/158【例例2-132-13】

64、引用】引用传递测试。传递测试。 程序的运行结果是:程序的运行结果是:未调用函数前未调用函数前a=6 b=8在引用传递函数中在引用传递函数中x=8 y=6引用传递后引用传递后a=8 b=6 2024/8/1592.4.5 * 缺省参数缺省参数 缺缺省省参参数数(又又称称默默认认参参数数)指指的的是是,在在VC中中可可以以设设置置函函数数形形参参的的默默认认值值,下下面面例例子子中中就就有有一一个个带带有缺省参数的函数:有缺省参数的函数: GetVolume(int length,int width=2,int height=4); 其其中中width的的默默认认值值为为2,height的的默默认

65、认值值为为4。缺缺省省参参数数是是在在函函数数声声明明时时就就已已经经给给定定的的一一个个值值,若若在在调调用用函函数数时时,没没有有传传递递给给该该形形参参的的值值实实参参的的话话,那么编译器就那么编译器就自动自动插上这个值。插上这个值。 2024/8/160【例例2-14】带有缺省参数的求体积函数测试。】带有缺省参数的求体积函数测试。 intint GetVolume(intGetVolume(int length,intlength,int width=2,int height=4); width=2,int height=4); /求体积的函数原型求体积的函数原型, ,它有两个缺省参数

66、它有两个缺省参数intint main(intmain(int argcargc, char* , char* argvargv) intint length=10,width=20,height=30; length=10,width=20,height=30;coutcout传传递递3 3个个实实参参的的体体积积为为GetVolume(length,width,heightGetVolume(length,width,height)endlendl; ; coutcout传递传递2 2个实参的体积为个实参的体积为GetVolume(length,widthGetVolume(length,

67、width)endlendl; ; coutcout传递传递1 1个实参的体积为个实参的体积为GetVolume(lengthGetVolume(length)endlendl; ; return 0;return 0; intint GetVolume(intGetVolume(int length,intlength,int width,intwidth,int height) height) coutcoutlengthtwidththeightlengthtwidththeightendlendl; ;/输出长、宽、高输出长、宽、高return length*width*height;

68、/return length*width*height;/输出体积输出体积 2024/8/161【例例2-14】带有缺省参数的求体积函数测试。】带有缺省参数的求体积函数测试。 程序运行结果为:程序运行结果为:10 20 30传递传递3个实参的体积为个实参的体积为600010 20 4 传递传递2个实参的体积为个实参的体积为80010 2 4传递传递1个实参的体积为个实参的体积为802024/8/162使用缺省参数的注意事项:使用缺省参数的注意事项: (1)如果一个函数有多个缺省参数,则在形式参数的)如果一个函数有多个缺省参数,则在形式参数的分布中,缺省参数应分布中,缺省参数应从右向左从右向左排列,在函数调用时,排列,在函数调用时,只能从只能从左左匹配;匹配; (2)缺省参数的值)缺省参数的值可以可以是全局变量、全局常量,甚至是全局变量、全局常量,甚至是函数,但是函数,但不可以不可以是局部变量是局部变量; (3)如果函数有原型声明时,则缺省参数的说明如果函数有原型声明时,则缺省参数的说明只能只能在函数的原型声明中,而在函数的原型声明中,而不能不能出现在函数的定义说明出现在函数的定义说明中;中; (4)如果函数只有定义说明而没有原型声明时,则缺如果函数只有定义说明而没有原型声明时,则缺省参数的说明省参数的说明可以可以出现在函数的定义中。出现在函数的定义中。 2024/8/163

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号