欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    windows界面程序开发第2章C语言基础.ppt

    • 资源ID:6523736       资源大小:280KB        全文页数:100页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    windows界面程序开发第2章C语言基础.ppt

    1,第 2 章 C+语言基础,2,2.1 C+概述,C+源于C语言,而C语言是在B语言的基础上发展起来的。1960年出现了一种面向问题的高级语言ALGOL 60。1963年英国剑桥大学推出了CPL(Combined Programming Language)语言,后来经简化为BCPL语言。1970年美国贝尔实验室的K.Thompson以BCPL语言为基础,设计了一种类似于BCPL的语言,取其第一字母B,称为B语言。1972年美国贝尔实验室的Dennis M.Ritchie为克服B语言的诸多不足,在B语言的基础上重新设计了一种语言,取其第二字母C,故称为C语言。1980年贝尔实验室的Bjarne Stroustrup对C语言进行了扩充,推出了“带类的C”,多次修改后起名为C+。以后又经过不断的改进,发展成为今天的C+。,3,C+是由C扩充而来,因此,除了与C兼容,C+还继承了C的以下特点:丰富的运算符和数据类型、结构化的程序设计方法、高效的机器代码、良好的可移植性。支持面向对象程序设计的方法。C+的错误检查机制强,提供了专门的机制检查类和异常处理功能。C+有很多成熟的编译器:Microsoft Wondows的Visual C+、Inprise的C+Builder、Borland的Borland C+和IBM的VisualAge C+。,2.1.1 C+的主要特点,(),4,C语言程序:#include void main(void)/*这是一个简单的C程序:simple.c*/printf(Hello World!n);/输出字符串,2.1.2 C+程序与C程序,C+语言程序:#include void main(void)/这是一个简单的C+程序:simple.cppcout Hello World!endl;/输出字符串,(),5,(1)C+程序与C程序的结构完全相同。(2)C源程序文件的扩展名为C,C+源程序文件的扩展名为CPP。(3)C注释使用符号“/*”和“*/”,表示符号“/*”和“*/”之间的内容都是注释;C+除了支持这种注释,还提供了一个双斜线“/”注释符,表示“/”之后的本行内容是注释,注释在行尾自动结束。(4)C程序所包含的标准输入、输出的头文件是stdio.h,输入、输出通常通过调用函数来完成;而C+程序可以包含标准输入、输出流的头文件iostream.h,输入、输出可以通过使用标准输入、输出流对象来完成。,C+程序与C程序的比较:,(),6,一个C+程序可以由多个函数构成;每个程序都从主函数main()开始执行,从主函数返回时结束执行;组成程序的语句主要包括声明语句和执行语句:-声明语句用于声明变量和函数,变量声明语句说明变量的名称和数据类型,函数声明语句说明函数的名称、参数类型和返回值;-执行语句包括:赋值语句、表达式语句、函数调用语句和流程控制语句等,它们写在一个函数中(包括主函数)。,C+程序基本结构:,7,(1)当函数定义放在函数调用之后时,C程序函数原形(function prototype)有时可省略,而C+函数原形(声明)必不可少。一个不带参数的C函数原形必须使用void,而C+可以使用空参数列表。C+还要求函数所有参数在函数原形的圆括号中声明。(2)在C语言中,函数和语句块(花括号“”之间的代码)的所有变量声明语句必须放在所有执行语句之前。而C+中变量声明语句不要求放在函数和语句块的开始位置,可以把变量声明放在首次使用变量的附近位置,这样可提高程序的可读性。,2.1.3 C+对C的一般扩充,(),8,(3)C+用new和delete运算符取代C的内存分配和释放函数malloc()和free()。(4)标准C+提供了字符串类,可以替代C函数库中的字符数组处理函数。(5)进行输入、输出操作时,C+用控制台输入、输出流对象(在头文件iostream.h中进行了类的声明)替代C的stdio函数库,利用“”流提取运算符或“”流插入运算符,分别将数据对象从输入流提取出来或插入到输出流,从而完成数据的输入和输出。使用C+面向流的输入、输出方式提高了程序的可读性,减少了错误的发生。,(),9,#include/使用输入、输出流void main(void)coutxyz;/从键盘读取数据给变量x、y、z coutThe sum is x+y+zendl;/输出结果,例 编写程序利用标准输入流接收用户从键盘输入的数据,利用标准输出流将运算结果输出到屏幕。,程序运行的结果为:please enter the value of x,y,z:2 4 6The sum is 12,(),10,2.1.4 利用Visual C+编制和运行C+程序,11,2.2 C+程序基本要素,程序由语句组成,语句由基本要素组成。任何一种程序设计语言都有自己的一套语法规则以及按照语法规则构成的元素,程序基本要素就是这样一种具有独立语法意义的元素。C+程序基本要素主要包括标识符、关键字、常量、变量、运算符和表达式等。,12,标识符是程序员或系统定义的符号,用以标识变量、函数、对象等。标识符由字母、数字和下划线组成,它必须以字母或下划线开始。为标识符取名时,尽量使用能够反映其用途的单词或缩写,这样可提高程序的可读性。,2.2.1 标识符,例如:x,y,sum,length,Area,Myfun,m_xPos,CPerson,person1,13,关键字是C+编译器预定义的、具有固定含义的保留字,在程序中它们不能被作为一般的标识符使用。C+增加了C不具有的关键字,并且不同C+编译器含有不同的关键字。,2.2.2 关键字,例如:auto,bool,break,case,char,class,const,continue,default,delete,do,double,else,enum,extern,false,float,for,friend,goto,if,inline,int,long,new,operator,private,protected,public,return,short,signed,sizeof,static,struct,switch,template,this,true,try,typedef,union,unsigned,using,virtual,void,while,(),14,在程序中使用的数据有常量和变量两种形式;常量是不能被程序改变的固定值;变量是可以被程序改变的数据。常量和变量的主要区别在于:常量不占内存空间,不能为常量赋值;而变量需要占内存空间,可以给变量赋不同的值。不管常量还是变量,程序中使用的每一个数据都属于一种特定的数据类型。在使用变量之前,必须先利用标识符声明变量。,2.2.3 常量和变量,15,变量声明的一般形式如下:=,=,;,变量声明语句说明了变量的名称和数据类型,程序中通过变量名来存取其中的数据,数据类型定义了变量的存储结构和可以进行的运算。编译程序要为声明的变量分配存储空间,并可以给变量赋一个初始值。例如:int x;float radius=123.56;int x,y=100;,16,2.2.4 运算符和表达式,运算符:运算是对数据进行加工的过程,表示各种不同运算的符号称为运算符,而参与运算的数据称为操作数。运算符实质上是系统预定义的函数名,而进行运算就是调用一个函数。按运算符和操作数的运算性质,运算符可分为算术运算符、逻辑运算符、关系运算符和其它运算符。常用:+、-、*、/、%、+、()、=、+=、-、&、=、new、delete,C+常用运算符,C+常用运算符(续),19,例如:x+y,area=PI*radius*radius,(a b)&(x=y),表达式:一个表达式由常量、变量、函数调用和运算符组成,每个表达式都将产生一个值,并且具有某种类型(称为该表达式的类型)。表达式隐含的数据类型取决于组成表达式的操作数的类型。当表达式中的操作数都是常量时,称这个表达式是常量表达式。在对一个表达式求值时,优先级高的运算符先运算,优先级低的运算符后运算。运算符的结合性:右结合性和左结合性,20,2.3 C+数据类型,数据是程序加工的对象。C+将数据分为不同的数据类型,不管常量还是变量,它们都属于某一种数据类型。数据类型规定了数据的存储结构和可以进行的运算。C+中的数据类型分为:基本数据类型、指针类型和构造类型三大类。构造类型包括数组、结构和枚举等类型。,21,2.3.1 基本数据类型,基本数据类型是C+预定义的数据类型,C+的基本数据类型包括字符型、整数型、实型(单精度和双精度)和无值型。每种基本数据类型都使用一个关键字来表示,如char、int、float、double和void等。数组、指针和类等派生数据类型是程序员按照C+的语法要求在基本数据类型基础之上建立起来的。除void数据类型以外,其它基本数据类型加类型修饰符signed、unsigned、short和long。,C+基本数据类型,23,例:int num,total;float v,r,h;int a=3;/等价于:int a(3);char c=A;long lx=12345678;unsigned int nWidth;,可以使用运算符“()”进行强制类型转换:float x=123.56;int i=(int)x;/i=123,24,2.3.2 const常量类型,const常量类型表示一个“常值变量”,即值不能被改变的变量。声明一个const型变量只需在数据类型说明前加上关键字const。例如:const int size=20;用const声明的变量必须用常量或常量表达式初始化。一旦变量被声明为const型,禁止任何试图修改该变量的操作。如果知道一个变量赋初值后在生命周期里其值不变,用const限定该变量是程序设计的好习惯,如数组长度。,25,数组属于构造类型,它是一组具有相同类型数据的有序集合,其中每个数据称为数组的元素。数组按其下标的个数分为一维数组、二维数组和多维数组。数组的声明方式如下:常量表达式;常量表达式 常量表达式;数组的使用:数组声明后,可以引用数组每个元素,但不能一次引用整个数组。数组元素作为一个简单的变量对待。数组元素的引用方式如下:下标表达式下标表达式 下标表达式,2.3.3 数组,26,注意:数组元素的下标从0开始,直到数组长度减1,如:score0,score1,score29。在编译C+源程序时,为了保证程序编译和运行的效率,C+编译系统不对数组下标进行越界检查,程序运行时系统也不会提出越界警告。因此在对数组元素进行操作时应格外注意,以免破坏其它存储单元的数据,否则可能造成不可预料的后果。两维数组按行存储。int a23=2,4,6,8,10,12;/按数组的排列顺序 int a23=2,4,6,8,10,12;/分行赋初始值,27,任何变量都有一个内存地址,这种地址称为指针,而指针变量是一种存放内存地址的变量。每一个指针变量都有相应的数据类型,该类型用以说明指针所指内存单元中存放的数据的类型。指针变量声明的一般形式为:*;符号“*”是指针类型说明符,声明变量是一个指针型变量。例如:int*pointer;int*pointer;/两条语句功能相同,2.3.4 指针,28,有两个与指针有关的运算符:取地址运算符“”和指针运算符“*”;运算符“”用于取一个变量的地址;运算符“*”以一个指针作为其操作数,其运算结果表示所指向的变量;“”运算和“*”运算互为逆运算。,与指针有关的运算符,29,#include void main()int a,b,*pa,*pb;a=10;b=20;pa=,例 指针的使用。,30,指针与数组,指针与数组关系密切,编程时可以用指针代替下标引用数组元素,指针使数组的使用更为灵活、有效;当声明一个数组后,编译程序会按照数组的类型和长度为它分配内存空间,数组名表示数组在内存中的首地址;当用一个指针变量存储数组首地址时,该指针就指向这个数组,就可以通过指针运算间接访问数组的元素。,31,例2 利用指针引用数组的方法求一个数组中所有元素之和。,#include void main()int a=2,4,6,8,10;int*pa=a;/或pa=,32,C+语言没有提供字符串类型,字符串变量是作为一维字符数组来处理。字符串末尾必须加上一个字符串结束符“0”,但“0”不是字符串的有效字符,求字符串的长度时不能将它计算在内。对于字符串常量(用一对双引号括起来的字符序列),C+编译程序自动在字符串的末尾加上字符0,因此,可以直接用一个字符串常量来初始化一个字符数组。char s=Hello;,2.3.5 字符串,33,结构(structure)属于构造类型,它是由多种类型的数据成分组成的数据类型。例如,一个职员的信息由ID号、姓名、性别、出生日期和工资等数据项组成,可采用结构类型来表示。区别以前所介绍过的数据类型,结构的具体构成需要用户自己定义,即定义一个结构类型。结构中的每个数据项称为成员,成员的类型可以是基本数据类型,也可以是一个诸如结构这样的构造类型。,2.3.6 结构,(),34,结构类型定义的一般形式为:struct;.;,(),35,下面定义职员结构类型:struct staffer intID;charname20;bool sex;float salary;,定义了结构(类型),就可以用结构声明结构变量,结构变量的声明形式如下:;,(),36,例如,利用定义的职员结构staffer声明一个职员结构变量:staffer employee1;,注意:不能在定义结构时对成员进行初始化,因为结构是一种数据类型,而不是一个变量。只有在声明一个结构变量时才可以对该结构变量的成员进行初始化。如下所示:staffer employee1=110105,LiMing,1,3809.80;,(),37,结构变量的引用包括整个变量的引用和其成员的引用。作为变量,整个结构变量可以进行赋值、作为函数参数和返回值。结构成员引用的形式为:.,结构变量的引用,指向结构变量的指针 结构变量的指针的声明、赋值和使用规则同普通指针一样。可以通过使用指向运算符“-”引用结构成员。引用的形式如下:-,(),38,枚举类型(enum)也是程序员定义的类型,它是一种允许用符号常量代表数据的数据类型。在定义枚举类型时必须指定一组被命名的符号常量的集合,该集合决定了该枚举类型的变量可以具有的合法值。枚举类型定义的一般形式为:enum,;枚举常量是C+标识符,每一个枚举常量对应一个整数值,第1个常量值为0,第2个常量值为1,依此类推。,2.3.7 枚举,39,使用举例:,以下定义了一个表示颜色的枚举类型:enum ColorRed,Green,Blue;定义好的枚举类型可作为数据类型用于声明枚举型变量,例如:enum Color MyColor;声明了枚举型变量,就可以将定义枚举类型时所列举的枚举常量集合中的任何一个常量赋值给枚举型变量。例如:MyColor=Green;在定义枚举类型时,可以为枚举常量指定其对应的整型值,例如:enum ColorRed=-1,Green,Blue=3;,40,用typedef语句定义类型是指对原有的数据类型定义一个新的名称,而不是真正定义一个新的数据类型。typedef语句的使用形式为:typedef;其中的数据类型可以是简单的数据类型,如int、float和char等,也可以是诸如结构、枚举等组合数据类型。使用typedef的目的有两个:移植程序,增加程序的可读性。,2.3.8 用typedef定义类型,41,typedef int INTEGER;typedef unsigned char BYTE;typedef struct tagDate int year;int month;int day;DATE;新定义数据类型如INTEGER(一般用大小字母)与int完全一样,可以用它进行变量的声明。如:INTEGER i;,例如:,42,2.4 控制语句,从结构化程序设计的观点考虑问题,任何算法功能都可以通过三种流程控制结构来实现。为了实现复杂的算法功能,除了采用一般的按照源代码编写顺序执行程序的顺序结构,还需要采用另外两种能够控制语句执行顺序的控制结构:分支结构和循环结构。分支结构是根据某个条件来决定执行哪些源代码,循环结构是根据某个条件来决定是否重复执行一段源代码。C+提供了多种不同形式的流程控制语句。,43,包括if语句和switch语句,用于实现分支结构。if 语句的一般形式:if()如果表达式的值为真(非0),则执行其中的语句(块),否则跳过该语句。,2.4.1 条件语句,if语句的另一种形式:if()else,44,if语句的嵌套形式:,if()else if()else if().else if()else,45,例 输入一个学生三门课的成绩,计算其平均值,并根据其值输出评语。,#include void main()int math,chem,phy,ave;coutmathchemphy;ave=(math+chem+phy)/3.0+0.5;/0.5用于四舍五入if(ave=90)/使用ifelse if语句cout=60,46,switch()case:break;case:break;.case:break;default:;,多分支结构switch语句的一般形式:,47,switch语句使用说明:,执行switch语句时将其中表达式的值与一些常量进行比较,当某case语句中的常量与该表达式的值相等时,就执行该case语句后的语句(块),直到遇到break语句或到达switch语句末尾时退出switch结构。如果未出现相等的情况,则执行default后的语句。default语句可缺省,此时如果未出现相等的情况则不执行任何语句。在switch语句中,表达式与常量的类型必须一致,且只能是字符型、整形或枚举型。,48,例 键盘输入一个字符,判断输入的字符是数字、空格,还是其它字符,并给出相应的提示信息。,#include void main()char ch;coutch不能输入空格switch(ch)case 0:case 1:.case 9:coutIt is a digit.endl;break;case:coutIt is a space.endl;break;default:coutIt is not a digit or space.endl;,49,循环结构在很大程度上简化了顺序结构程序设计,特别是在一段代码执行次数未知的情况下,只能采用循环结构。循环语句:for语句、while语句、do-while语句 循环条件和循环体是循环语句所必备的组成部分,重复执行的程序段称为循环体,循环语句根据循环条件判断是否执行循环体。,2.4.2 循环语句,50,1.for语句:,for(;),表达式2是循环条件表达式,其值为真时执行循环,为假时终止循环。在进入for循环时,先对表达式l求值,然后对表达式2求值,如果表达式2的值为真,执行循环体中的语句,最后对表达式3求值。每执行一次循环后再对表达式2求值,以决定是否进行下次循环。表达式l用于设置进入for循环时的初始状态,表达式3用于改变某些变量的值,以便使表达式2的值为假,最终使for循环结束。,51,例 显示一个摄氏温度和华氏温度的对照表。,#include void main()float degCel;int degFahr;for(degFahr=0;degFahr=300;degFahr+=10)/从华氏零度到300度每隔10度显示一项 degCel=(5.0/9.0)*(degFahr-32.0);coutFahrenheit:degFahr ttCelsius:degCelendl;,52,for语句的其他使用形式:,在for循环后面的圆括号内可以声明变量,还可使用逗号表达式,如:for(int i=0,j=0;i 100;i+,j+=5)coutij;,组成for循环的表达式可以部分或全部省略掉。int n=-1;for(;n n;程序不断读入整数,直到遇到一个大于零的整数为止。,53,2.while语句:,while()表达式是循环条件表达式,为真时执行循环体中的语句,为假时终止循环。,do while();do-while语句与while语句功能类似,只是循环条件的判断是在循环语句的末尾进行。do-while语句的循环体至少执行一次。,3.do-while语句:,54,例 利用while语句编程,要求用户输入字符Y或N,并给出对应的提示信息。如果输入其它字符,程序显示一条出错信息,并要求用户重新进行输入。,#include main()char response;coutresponse;while(response!=Y,55,2.5 函数,当设计一个解决复杂问题的程序时,常常将一个复杂的任务分解为若干简单的子任务,为每一个子任务设计一个子程序。在C+中,利用函数实现子程序的编程。函数是一个具有独立功能的程序模块,这种功能一般是一种通用的功能,通过在不同程序中或程序不同地方调用函数,可以反复使用一个函数所实现的功能。如将求平方根、解一元二次方程等算法分别用一个函数来实现,程序员就可以在程序中需要使用求解算法的地方直接调用已设计好的函数。,56,2.5.1 函数定义、函数调用和函数声明,1.函数定义:编写一个实现特定功能的函数代码就称为函数定义。函数定义的一般形式是:,()函数的组成:函数类型、函数名、形参表、函数体。,(),57,函数类型:函数头中的数据类型称为函数类型,它规定了所定义函数返回值的类型。如果函数没有返回值,则函数类型应指定为void类型。如果不指定函数类型,则其默认类型为int型。,形参表:函数定义中的形参表是一个用逗号分隔的变量声明列表,这些变量称作函数的形参,它们用于接收调用函数时传递的参数值。形参表可以为空。,(),58,例 以下函数sum()用于求两个形参x与y的和。,int sum(int x,int y)int temp;temp=x+y;return temp;/将temp返回给主调函数,注意:C+不允许嵌套定义函数,即将一个函数定义放在另一个函数的函数体内。但可以递归调用。,(),59,2.函数调用:使用一个已定义的函数称为函数调用。调用某个函数的函数称为该函数的主调函数,被调用的函数简称为被调函数。,函数定义后便可以反复多次调用,每次调用通过不同的参数值(实参)可以处理不同的数据函数调用的一般形式为:(实参1,实参2,实参n)例如:c=sum(a,b);功能:将实参a和b相加,其和放于c中,(),60,函数调用时的执行流程:当出现函数调用语句时,中断当前函数(主调函数)的执行,将程序的执行流程转移到被调用函数,并将实参传递给形参。实参是一个实际的参数值,它可以是常量、变量或表达式。,参数传递方式:值传递:单向 按地址传递:双向 引用传递:双向,(),61,3.函数声明,C+允许函数调用在前,函数定义在后,但此时要求在调用函数前必须先进行函数声明,以便告诉编译程序被调用函数的类型和参数类型。函数声明的一般形式为:(形参表);,例如:只列出参数类型:void swap(int*,int*);列出参数类型和参数名:void swap(int*px,int*py),(),62,函数的存储类型,与变量类似,函数也具有存储类型。函数被分为内部函数(static)和外部函数(extern,默认值),内部函数只能被同一个源文件中的函数调用,而外部函数可以被其它源文件中的函数调用。调用外部函数前必须先进行外部函数声明。,例如:在源文件File1.cpp中定义函数YourFun(),而在源文件File2.cpp中调用函数YourFun()。,63,File1.cpp源文件:int YourFun(int x,int y)/默认为外部函数 int temp;temp=x+y;return temp;,File2.cpp源文件:#include/外部函数声明,可省略externextern int YourFun(int,int);main()int sum,a=20,b=40;sum=YourFun(a,b);coutsum=sum endl;,通常可将所有外部函数的声明放在一个头文件中,然后用#include 指令包含头文件。,64,2.5.2 函数参数的默认值,1.什么是函数参数的默认值(缺省值):C+允许在函数声明或函数定义时为形参指定一个默认值。在调用此类含默认值形参的函数时,如果形参有对应的实参,则将实参传递给形参;如果省略了实参,则将上述默认值传递给形参。,例如,下面声明一个带缺省值参数的函数:void MyFun(int val=10);而如果函数调用省略实参,则把缺省值10传递给形参,如下所示:MyFun();/等同于MyFun(10),(),65,2.含有多个函数参数的默认值:,如果函数有多个形参,则声明和定义函数时,必须将带缺省值的形参放在参数表的右部,即在带缺省值的形参的右边不能有未指定缺省值的形参。例如:void fun1(int w,int x=1,int y=1,int z=1);/正确的函数声明 void fun2(int w=1,int x=2,int y=3,int z);/错误的函数声明 void fun3(int w=1,int x=2,int y,int z=3);/错误的函数声明,(),66,3.含有多个参数默认值的函数调用:,当编译器将实参与形参相联系时,其顺序是从左到右,如果只省略前面的实参,编译器将无法区分随后的实参与哪个形参相对应。因此,在调用函数时,如果省略某个实参,则该实参右边的所有实参都必须省略。例如:fun1(10,3);/等同于fun1(10,3,1,1);fun1(10,3,5);/等同于fun1(10,3,5,1);fun1(10,5);/错误的函数调用,(),67,2.5.3 内联函数,在调用函数时,系统要进行现场处理工作,需要占用附加的现场处理时间。若把函数体直接嵌入函数调用处,则可消除附加的现场处理的时间开销,提高程序的运行效率。C+提供了实现上述嵌入功能的函数,这种函数称为内联(inline)函数。定义一个内联函数只需在函数头前加入关键字inline。当编译程序遇到内联函数调用语句时,需要将该内联函数的函数体替换调用语句。当然,这样将会加大代码占用内存的空间开销,因此,内联函数一般适用于代码较短的函数。,inline int sum(int x,int y)int temp;temp=x+y;return temp;,68,2.5.4 引用,引用(reference)是为一个已声明的变量起一个别名。声明一个引用时需要在其名称前加符号“&”,并同时对引用进行初始化,即指定它所引用的对象(是哪一个变量的别名)。声明一个引用一般采用如下格式:&=;,例如:int ActualInt;/声明变量ActualIntint&OtherInt=ActualInt;/声明变量ActualInt的引用OtherInt,69,一旦为一个变量声明一个引用,那么对这个引用的所有操作实际上都是对被引用变量的操作,它们代表同一个变量并且占用相同的内存单元。例如,为变量i声明一个引用r,在程序中分别对r和i进行操作。当r变化时,i也随之变化,反之亦然。,void main(void)int i=10;int,运行结果:i=11,r=11i=88,r=88,70,引用作为函数参数,引用作为一般变量使用几乎没有什么意义,它的最大用处莫过于将其作为函数参数。在前面学习了按值传递和按地址传递两种参数传递方式,而引用传递与按地址传递在功能上很相象,可以在被调函数中通过改变形参来改变主调函数中的实参,但引用传递比按地址传递更简捷直观,也更好理解。采用引用传递方式,只需在函数定义时使用引用作为形参,在函数调用时直接使用一般变量作为实参。,71,当引用被用作函数参数时,被调函数任何对引用的修改都将影响主调函数中的实参,被调函数对引用的操作即是通过实参的别名对实参进行操作。,例 引用作为参数。,#include void swap(int,72,2.6 变量的作用域与存储类型,变量的作用域是指变量的可以被引用的区域,变量的生存期是指变量的生命周期,变量的作用域与生存期是密切相关的。C+程序中的变量有两种属性:数据类型和存储类型,进行完整的变量声明,除了声明其数据类型,有时还需要声明其存储类型。存储类型说明了变量在内存中存储的方式,它决定了变量的作用域和生存期。,73,2.6.1 作用域和生存期,变量的作用域决定了变量的可见性,说明变量在程序哪个区域可用,即程序中哪些区域的语句可以使用变量。作用域有三种:局部作用域、全局作用域和文件作用域。具有局部作用域的变量称为局部变量,它们声明在函数(包括main)的内部,又称为内部变量。其作用域在函数结束时结束。具有全局作用域和文件作用域的变量称为全局变量,它们声明在函数的外部,其作用域在程序源文件结束处结束。,74,例 局部变量(包括块内声明的变量)和函数的形参具有局部作用域。,void Myfun(int x)/形参x的作用域开始于此int y=3;/局部变量y的作用域开始于此 int z=x+y;/块内局部变量z的作用域开始于此,/x和y在该语句块内可用./局部变量k的作用域不包含该块/局部变量z的作用域结束 int k;/局部变量k的作用域开始于此./局部变量y、k和形参x的作用域结束,75,例 具有全局作用域的全局变量。,.int x=1;/全局变量x的作用域开始于此,/结束于整个程序源文件void Myfun().,注意:在同一作用域内声明的变量不能同名;不同作用域声明的变量可以同名。,76,作用域与生存期的区别与关系:,变量的作用域是指一个范围,是指变量在源程序中的一段静态区域,作用域是从代码空间的角度考虑问题。变量的生存期是从时间的角度考虑问题,是指在程序执行的过程中一个变量从创建到被撤消的一段动态时间。当系统为变量分配内存空间后,变量即开始处于生存期,当变量所占用的内存空间被释放,这个变量即结束了生存期。变量的生存期与作用域是密切相关的,一般变量只有在生存后才能可见(在作用域内)。,77,例 局部变量的生存期和作用域void Myfun()int x=1;int x=2,y=2;/变量“x=1”失去作用域cout“x=”xn;FuncA();/变量x和y在调用函数时失去作用域,第一个声明的局部变量x在语句块内虽然存在,但却是不可见(不可用)的,因为它被语句块内同名的局部变量x所屏蔽了。局部变量x和y在语句块内虽然存在,但在进入函数FuncA()后也是不可见的。,78,2.6.2 存储类型,程序运行时,系统为不同存储属性的变量分配不同类型的内存空间,决定了变量的作用域和生存期。变量有以下三种内存分配方式:静态分配、自动分配和动态分配。系统为每个程序开辟一个固定的静态存储区,静态分配是指在这个固定区域为变量分配内存空间。对于静态分配内存的变量,在编译时就分配了内存地址(相对地址),在程序开始执行时变量就占用内存,直到程序结束时变量才释放内存。全局变量就是静态分配方式的变量。,79,程序运行后,系统将为程序开辟一块称为栈的活动存储区。自动分配是指在栈中为变量临时分配内存空间。对于自动分配内存的变量,程序运行后,在变量作用域开始时由系统自动为变量分配内存,在作用域结束后即释放内存。一般方式声明的局部变量就是自动分配方式的变量。动态分配是指利用一个被称为堆的内存块为变量分配内存空间,堆使用了静态存储区和栈之外的部分内存。动态分配是一种完全由程序本身控制内存的使用的分配方式。对于动态分配内存空间的变量,程序运行后,利用new运算符分配内存,利用delete运算符或程序结束运行释放内存。,80,对于非动态分配内存的变量,决定变量采用哪种内存分配方式,是由声明变量时指定的存储类型和变量声明语句的位置所决定的。变量的存储类型有以下四种:auto、register、extern和static。在声明变量时可以指定变量的存储类型,其一般形式为:;,存储类型决定内存分配方式:,例如:auto int a;/a为自动存储类型static float b,c;/b和c为静态存储类型,81,auto和register用于声明内部变量,auto变量存储在栈中,register变量存储寄存器中。extern用于声明外部变量,static用于声明内部变量或外部变量,extern变量和static变量是存储在静态存储区中。当声明变量时未指定存储类型,则内部变量的存储类型隐含为auto类型,外部变量的存储类型隐含为extern类型。,说明:,例如:auto int a;/变量a存储在栈中static float b,c;/b和c存储在静态存储区,82,外部变量的声明分为定义性声明和引用性声明。定义性声明表示变量需要分配内存;引用性声明表示要引用的变量已在程序源文件中其它地方进行过定义性声明。定义性声明只能放在函数的外部,引用性声明可放在函数的外部,也可放在函数的内部。extern修饰符主要用于外部变量的引用性声明,外部变量的定义性声明可以不加extern修饰符。进行外部变量的extern引用性声明时一般不能进行初始化,除非定义性声明该外部变量时没有进行初始化。,外部变量的声明:,83,.extern int b;/引用性声明。void fun()coutb;/输出5extern int b=5;/定义性声明,可省略extern.,例 外部变量的使用出现在定义性声明之前需要先进行变量的引用性声明。,84,声明变量时使用static修饰符的变量是静态变量。静态变量可以是全局变量,也可以是局部变量,但都具有全局的生存寿命,即其生存期从程序启动时开始直到程序结束时才终止。这种存储类型的变量虽然只在其作用域内可以使用,但它一直存在。,静态变量,85,#include void fun()/静态变量a是局部变量,但具有全局的生存期 static int a=5;a+;couta=a endl;void main()for(int i=0;i 2;i+)fun();,例 静态局部变量的使用。,程序输出:a=6a=7,问题:如果a不是静态变量,结果如何?,86,2.6.3 作用域限定符:,我们知道,如果局部变量和全局变量同名,在局部作用域内只有局部变量才起作用。在C+中可通过使用作用域限定符:来标识同名的全局变量。,int amount=123;/全局变量void main()int amount=456;/局部变量cout:amount,;/输出全局变量coutamount,;/输出局部变量:amount=789;/访问全局变量cout:amount,;/输出全局变量coutamountn;/输出局部变量,程序输出:123,456,789,456,87,2.6.4 动态内存分配,对于程序中一般声明的变量,其所占内存空间不需要程序员管理,编译器在编译阶段就自动将管理这些空间的代码加入到目标文件中。程序运行后由系统自动为变量分配内存空间,在作用域结束后释放内存空间。,有时程序只能在运行时才能确定需要多少内存空间来存储数据,这时程序员就需要采用动态内存分配的方法设计程序。动态内存分配是指在程序运行时为程序中的变量分配内存空间,它完全由应用程序自己进行内存的分配和释放。动态内存分配是在一些被称为堆的内存块中为变量分配内存空间。,88,动态内存分配方法:,在C中动态内存分配是通过调用标准库函数malloc()和free()实现的。在C+中最常用的方法是利用new和delete运算符进行动态内存的分配和释放,使用这种方法能够检测内存漏洞。,运算符new的使用形式:p=new size;type是数据类型,表示要为哪种数据类型的变量分配空间;

    注意事项

    本文(windows界面程序开发第2章C语言基础.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开