全国计算机等级考试辅导讲义(C++部分)(5)

2019-08-26 17:29

佳恒计算机教育培训中心

该函数返回字符串s的长度,即字符串中字符的个数(不包括字符串结尾的′\ 0′)。 【考点二】 指针

指针(即指针变量)是C++语言最大的功能之一。一个指针是一个特定类型数据的存储地址,比如一个变量的地址。与其他类型变量一样,指针变量也必须要声明。指针变量声明的一般形式为:<数据类型>*<变量名>;

其中,<数据类型>是指针所指对象的类型,在C++中可以指向任何C++类型。<变量名>是指针变量名。指针使用两种特殊的运算符--*和&。一元(单目)运算符&用于返回其操作对象的内存地址,其操作对象通常为一个变量名。 例如:ptr=&total;

把变量total的内存地址存到指针变量ptr中。该地址是total变量在计算机内存中的存储地址。第二个与指针相关的运算符是*,它与&运算符作用相反。作为一元运算符的*用于返回其操作数所指对象的值,因此,该运算符要求其操作对象为一个指针。 1.指针和地址 (1)指针说明

从指针的定义可知,指针是用所指对象类型来表征的。在使用任何指针变量之前必须先给它赋一个所指合法具体对象的地址值。

如何使一个指针指向一个具体对象:

①使用new malloc和运算符(或alloc等函数)给指针分配一个具体空间。 例: int *p;p=new int; 系统自动根据int类型的空间大小开辟一个内存单元,用来保存int 型数据。 int *p;p=new int(30); 系统自动根据int类型的空间大小开辟一个内存单元。 int *p;p=new int[10]; 系统为指针p分配了整型数组的内存,数组中有10个元素。 ②将另一个同类型的指针赋给它以获得值。 ③通过&运算符指向某个对象。 (2)指针运算

尽管指针中存放的是变量的地址,但在C++中指针只能进行如下运算。 ①指针和整型量可以进行加减

②若p1,p2为指针,当p1和p2指向同一类型时,可以进行赋值。

③两个指向同一类型的指针,可进行= =,>,<等关系运算,其实就是地址的比较。

④两个指向同一数组成员的指针可进行相减,结果为两个指针之间相差元素的个数。注意:两指针不能相加。 2.指针和数组

在C++中,指针和数组的关系极为密切。实际上,数组的参数传递、数组元素的存取,都可通过指针操作来完成。指针和数组常常可以互换。在C++中,数组的名字就是指向该数组第一个元素(下标为0)的指针,即该数组第一个元素的地址,也即数组的首地址。一般情况下,一个数组元素的下标访问a[i]等价于相应的指针访问*(a+i)。 但特别注意:

数组名和指针(变量)是有区别的,前者是常量,即数组名是一个常量指针,而后者是指针变量。因此,尽管我们可写pa=a;但不能写:a=pa;或pa=&a;因为我们不能改变常量的值,也不能取常量的地址。

数组名可作为参数进行传递。当将数组名传给函数时,实际上所传递的是数组的开始地址。(即数组第一个元素的地址)为什么要使用指针?简单地说指针运算比数组运算的速度快。此外,使用指针的另外一个原因是在大量数据传递时,使用传递指针要远比传递数据本身效率高的多,如在函数参数传递及函数返回值时。

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

当然,使用指针会给程序带来安全隐患(如指针悬挂问题,所谓指针悬挂是指指针指向了一块没有分配给用户使用的内存),同时还使得程序的可读性降低(显然,用数组实现的程序要比用指针实现的程序的可读性要好)。

对于字符串常量,可以把它看成是一个无名字符数组,C++编译程序会自动为它分配一个空间来存放这个常量,字符串常量的值本身就是指向这个无名字符数组的第一个字符的指针,其类型是字符指针。 3.指针数组和函数指针 (1)指针数组

指针数组就是由指针组成的数组,即数组中的每一个元素都是指向同一类型对象的指针。指针数组可以是全局的、静态的和局部的。

字符指针数组和二维字符数组在许多方面是一样的,如初始化形式、成员访问方式,因此我们有必要了解它们的区别和各自的使用场合。

尽管二维字符数组与字符指针数组在存储形式上不同,但它们在初始化形式以及访问元素方式上却是相同的。采用指针数组的理由是:它可以节省存贮空间,因而通常用来存放不同长度的字符串。

例如,如果要保存从标准输入或文件中读入的行,字符指针数组是一个好的选择。因为读入的行可能长短差异很大。(2)命令行参数

在C++中可以实现带有命令行参数的程序,它是通过main带有参数来实现的。在C++中,主函数main还可以带有参数,形式如下:int main(int argc,char *argv[]) 或int main(int argc,char **argv) 其中:argc为包含命令本身在内的参数个数。argc为指针数组,数组元素为指向各参数(包含命令本身在内)的指针。 (3)函数指针

在C++中,允许指针指向一个函数,即指向函数的指针。函数指针的说明形式为:类型(*标识符)(); 例如:int (* fp)();定义了一个指向返回值为整型值的函数的指针fp。

注意:int(*fp)();与int*fp();的不同在于,前者是函数指针,后者为返回指向int指针的函数。

与其他类型的指针变量一样,在使用函数指针前必须使它指向一个具体的函数。若要函数指针指向一个具体函数,可通过赋值语句或参数传递。函数指针=函数名;该赋值语句将使一个函数指针指向一个具体函数(在C++中,函数名是作为指向函数的指针值来处理)。 函数指针的最大用途是它可以使得一个函数作为其他函数的参数进行传递,扩展了函数的功能。 【考点二】 引用 1.引用的概念

引用是个别名,建立时须用另一个数据对象(如一个变量)的名字进行初始化,以指定该引用所代表的数据对象。此后,对引用的任何实际操作实际上就是对所代表的数据对象的操作。一个引用变量要占用相当于一个指针所需要的空间,但系统不会为它所代表的数据对象再次分配空间。在类型名后跟引用运算符\,以及引用名来创建一个引用。引用名就是一个变量名。

注意:引用运算符与地址操作符使用相同的符号(即运算符重载),但它们含义不一样。引用运算符只在声明变量的时候使用,它放在类型名后面。 使用引用时应遵循一定的规则:

(1)引用被创建时,它必须立即被初始化(指针则可以在任何时候被初始化)。

(2)一旦一个引用被初始化为一个对象的引用,它就不能再被改变为对另一个对象的引用。(指针则可以在任何时候改变为指向另一个对象。)

(3)不可能有NULL引用。必须确保引用是具体合法的对象的引用(即引用应和一块合法的存储空间关联)。 主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

2.用引用传递函数参数

引用的一个重要用途就是作为函数的参数。在C++中,函数参数传递采用的是传值,如果要有占用空间大的对象(例如一个大的结构对象或类对象)需要作为函数参数传递的时候,在C语言中的做法往往是使用指针,因为这样可以避免将整个实参对象数据全部拷贝给形式参数,可以提高程序的执行效率。在C++中,既可以使用指针,但由于C++引入了引用概念,亦可以用引用来做同样的事情。

引用作为参数的最大好处是:引用参数既可以像指针那样工作,其使用方式又和一般变量相同。也就是说,引用比指针具有更好的可读性。 【考点四】动态存储分配

动态存储分配功能在C++中是通过new和delete运算符来实现的。 1.使用new获得动态内存空间

运算符new用于申请动态存储空间,它的操作数为某种数据类型且可以带有初值表达式或元素个数。new返回一个指向其操作类型变量的指针。

使用new对某种类型变量进行动态分配的语法格式为:<指针>=new<类型>;

其中,<类型>表示要分配的变量类型(如char、int、double);<指针>表示指向<类型>类型变量的指针(如char*、int*、double*等)。

2.使用delete释放动态内存空间

当动态分配的内存空间在程序中使用完毕之后,必须显式地将它们释放。这样做的目的是把闲置不用的堆内存归还给系统,使其可以被系统重新分配。在C++程序中由new分配的动态内存空间必须通过delete运算符释放。使用delete对动态分配的单个变量进行释放的语法格式为:delete<指针>; 其中,<指针>表示指向单个变量的指针。使用delete对动态分配的数组进行释放的语法格式为:delete[]<指针>;其中,<指针>表示指向数组首元素的指针。delete之后的方括号指明将要释放的内存空间中存储着数组元素。程序中需要分配动态内存空间,则new和delete总是成对出现的。

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

第5章 函数

【考点一】函数定义

在标准C++中,函数的定义形式为:<返回类型><函数名>(<形参列表>){<函数体>}

<函数名>一般是标识符,一个程序只有一个main函数,其他函数名可随意取(当然,必须避免使用C++的关键字),好的程序设计风格要求函数名最好是取有助于记忆的名字,如getchar函数,通过函数的名字可以知道函数的功能,这无疑会增加程序的可读性。

<形参列表>是由逗号分隔的,分别说明函数的各个参数。形参将在函数被调用时从调用函数那里获得数据。在C++中,函数形参列表可以为空,即一个函数可以没有参数。但即使函数形参列表为空,括起函数参数的一对圆括号也不允许省略。

<返回类型>又称函数类型,表示一个函数所计算(或运行)的结果值的类型。如果一个函数没有结果值,如函数仅用来更新(或设置)变量值、显示信息等,则该函数返回类型为void类型。一个没有返回值的函数类似于一些程序语言(如pascal语言)中的过程(procedure)。

由一对花括号括起来的<函数体>是语句的序列,它定义了函数应执行的具体操作。需要注意的是,C++不允许函数定义嵌套,即在一个函数体内不能包含有其他函数的定义。 【考点二】函数调用

C++中函数调用的一般形式为:<函数名>(<实参表>)

当调用一个函数时,其实参的个数、类型及排列次序必须与函数定义时的形参相一致,也就是说实参与形参应该一对一地匹配。当函数定义时没有形参,则函数调用时,<实参表>亦为空。 依据对函数返回值的使用方式,函数的调用方法可分为以下几种:

(1)语句调用,这通常用于不带返回值的函数。这种情况下,被调用函数作为一个独立的语句出现在程序中。 (2)表达式调用。将被调用函数作为表达式的一部分来进行调用。它适用于被调用函数带有返回值的情况。 (3)参数调用。被调用函数作为另一个函数的一个参数进行调用。 【考点三】函数原型

在C++中,函数在使用之前要预先声明。这种声明在标准C++中称为函数原型(function prototype),函数原型给出了函数名、返回类型以及在调用函数时必须提供的参数的个数和类型。 函数原型的语法为:<返回类型><函数名>(<形参列表>); (注意在函数原型后要有分号)实际上函数原型说明有两种形式: (1)直接使用函数定义的头部,并在后面加上一个分号。

(2)在函数原型说明中省略参数列表中的形参变量名,仅给出函数名、函数类型、参数个数及次序。 注意:在C++中,在调用任何函数之前,必须确保它已有原型说明。 【考点四】 函数返回类型

根据函数是否带有参数以及函数是否有返回值,可以将函数分为如下四类。

1.带参数的有返回值函数定义形式为:<返回类型><函数名>(<参数列表>){<语句序列>} 2.不带参数的有返回值函数定义形式为:<返回类型><函数名>(){<语句序列>} 3.带参数的无返回值函数定义形式为:void<函数名>(<参数列表>){<语句序列>} 4.不带参数的无返回值函数定义形式为:void<函数名>(){<语句序列>} 【考点五】 函数参数

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

C++中,函数之间传递参数有传值和传地址两种传递方式。此外,C++还提供了默认参数机制,可以简化复杂函数的调用。

1.参数的传递方式

(1)传值 传值是将实参值的副本传递(拷贝)给被调用函数的形参。它是C++的默认参数传递方式,在此之前的多数函数参数传递都是传值。由于传值方式是将实参的值复制到形参中,因此实参和形参是两个不同的变量,有各自的存储空间,可以把函数形参看作是函数的局部变量。传值的最大好处是函数调用不会改变调用函数实参变量的内容,可避免不必要的副作用。

(2)传地址 有时我们确实需要通过函数调用来改变实参变量的值,或通过函数调用返回多个值(return语句只能返回一个值),这时仅靠传值方式是不能达到目的。 2.默认参数

在C++中,可以为参数指定默认值,在函数调用时没有指定与形参相对应的实参时就自动使用默认值。默认参数可以简化复杂函数的调用。默认参数通常在函数名第一次出现在程序中的时候,如在函数原型中,指定默认参数值。指定默认参数的方式从语法上看与变量初始化相似。 【考点六】 函数重载

如果能用同一个函数名字在不同类型上做相类似的操作就会方便很多,这种情况即为函数重载。其实这一技术早已用于C++的基本运算符。例如加法操作只有一个运算符+,但它却可以用来做整型数、浮点数和指针的加法运算。将这一思想推广到函数,即为函数重载。 【考点七】 内联函数

C++引入内联(inline)函数的原因是用它来取代C中的预处理宏函数。

内联函数和宏函数的区别在于,宏函数是由预处理器对宏进行替换,而内联函数是通过编译器来实现的,因此内联函数是真正的函数,只是在调用的时候,内联函数像宏函数一样的展开,所以它没有一般函数的参数压栈和退栈操作,减少了调用开销,因此,内联函数比普通函数有更高的执行效率。

在C++中使用inline关键字来定义内联函数。inline关键字放在函数定义中函数类型之前。不过,编译器会将在类的说明部分定义的任何函数都认定为内联函数,即使它们没有用inline说明。 【考点八】 递归函数

如果一个函数在其函数体内直接或间接地调用了自己,该函数就称为递归函数。递归是解决某些复杂问题的十分有效的方法。递归适用以下的一般场合。 (1)数据的定义形式按递归定义。

(2)数据之间的关系(即数据结构)按递归定义,如树的遍历,图的搜索等。 (3)问题解法按递归算法实现,例如回溯法等。使用递归需要注意以下几点:

用递归编写代码往往较为简洁,但要牺牲一定的效率。因为系统处理递归函数时都是通过压栈/退栈的方式实现的。 无论哪种递归调用,都必须有递归出口,即结束递归调用的条件。

编写递归函数时需要进行递归分析,既要保证正确使用了递归语句,还要保证完成了相应的操作。 【考点九】 变量作用域与生存周期 1.C++中变量的存储类型

分为如下几种类型:auto--函数内部的局部变量(auto可省略不写)。static--静态存储分配,又分为内部和外部静态。extern--全局变量(用于外部变量说明)。register--变量存储在硬件寄存器中。 (1)自动变量

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)


全国计算机等级考试辅导讲义(C++部分)(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2010年国家公务员考试行测真题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: