全国计算机等级考试《二级C++语言程序设计》【教材精讲+真题解析】讲义

全国计算机等级考试《二级C++语言程序设计》【教材精讲+真题解析】讲义


2024年4月29日发(作者:)

C.键

D.域

【答案】B

10.数据库设计的四个阶段是需求分析、概念设计、逻辑设计和( )。

A.编码设计

B.测试阶段

C.运行阶段

D.物理设计

【答案】D

第二部分 C++语言程序设计[视频讲解]

第1章 C++语言概述[视频讲解]

考试内容要求

1.了解C++语言的基本符号

2.了解C++语言的词汇(关键字、标识符、常量、运算符、标点符号等)

3.掌握C++程序的基本框架

4.能够使用Visual C++ 6.0集成开发环境编辑、编译、运行与调试程序

第一节 C++语言的发展

1.C++起源于C语言,并由C语言逐渐发展而来,是一种高级程序设计语

言,

2.C++是面向对象程序设计语言,更加接近于自然语言。

3.C++语言保留了结构化程序设计的方法,同时还具有许多C语言不支持

的新功能和新特性。

C++语言支持的新特性

版本 在C语言的基础上添加的新的特性

带类的C 类和派生类,公有成员和私有成员,构造函

数析构函数,友元,内联函数,赋值运算符

的重载

C++1.0 虚函数,函数运算符的重载,引用,常量

C++2.0 类的保护成员,多重继承,赋值和初始化的

递归定义,抽象类,静态成员函数,const

成员函数

C++3.0 模板,异常,类的嵌套,名字空间

第二节 C++语言的特点

1.C++是一种面向对象的程序设计语言,其中包括的新技术有:

◆抽象数据类型

◆封装和信息隐蔽

◆以继承和派生方式实现程序的重用

◆以运算符重载和虚函数来实现多态性

◆以模板来实现类型的参数化

2.C++是程序员和软件开发者在实践中创造的

3.C++是C语言的超集

◆超集是指——C++包含C语言的全部语法特征,C语言是C++的一个子集

◆继承了C语言简明、高效、灵活的优点

◆C语言程序员在学习过程中,只需要掌握C++的扩充特性

第三节 面向对象程序设计OOP ——(Object-Oriented Programming)

1. C语言的缺点

 结构化程序设计时面向过程的,即将功能分解并逐步求精

 数据和算法的一致性差,即两者相互分离

 程序的可用性差,重复性的工作无法避免,导致资源的浪费

2. C++的主要特征

◆ 封装性

• 是指将数据和算法捆绑成一个整体,即对象

• 解决了数据和算法一致性差的问题

• 采用“类”来支持封装性和隐蔽性

◆ 继承性

• 是指一种事物保留了另一种事物的全部特征,同时还具有自身的独特特

• C++采用继承机制来支持重用,在已经有的功能上进行新功能的扩展

◆ 多态性

• 是指当多种事物继承自一种事物时,同一种操作在它们之间表现出不同

的行为

• C++语言中使用函数重载、模板、虚函数来支持多态性

第四节 C++语言的基本符号

1.符号——组成语言的最小元素

2.基本符号分为三类

 字母——A~Z,a~z

 数字——0~9

 特殊符号——+ - * / = < > {【 】 “ ? ! 等30个

第五节 C++语言的词汇

1. 词汇——符号按照一定规则组成的单词

2. 合法词汇的五种类型

◆关键字

C标准规定的关键字:double return long if static等

C++标准补充的关键字:bool delete friend this 等

◆标识符

?是用户为程序中各种需要命名的“元素”所起的名字

?“元素”包括:变量、符号、函数、常量、结构、类、对象等

?规则如下:

√标识符是一个以字母或下划线开头的,有字母、数字、下划线组成的字

符串

√不能与关键字同名,区分大小写,不宜过长

◆字面常量——在程序中固定不变的值

?符号常量 pi=3.1415926中的pi

?字面常量 pi=3.1415926中的3.1415926

◆运算符——对程序中的数据进行操作的一类单词

?单字符组成的运算符 + - * /

?双字符组成的运算符 ++ -- -> &&

?三个字符组成的运算符 >>= <<=

?关键字运算符 new delete sizeof

◆标点符号——在程序中起分割内容和界定范围作用的一类单词

?空格

?分号 ;

?单、双引号 “ ” ‘ ’

?井字号 #

?双斜杠 //

?斜杠和型号 */ /*

?花括号 { }

第六节 C++程序的基本框架

1. 一个最简单的C++程序

//ex_

#include

int main( )

{

std::cout<<“This is a simple C++ Program.n”;

return 0;

}

2. 对程序的解释

 //ex_——注释行 (行注释“//” 块注释“/* */”)

 #include ——预处理命令,即将头文件中的内容加到程序

中,其中iostream是标准输入输出流头文件

 int main( )——主函数的声明

• 主函数是程序开始执行的入口地址

• 每个程序必须有且仅有一个主函数,名称必须是main

• int是函数返回值的类型

• ()表示main是个函数,可以带参数或者不带参数

 std::cout<<“This is a simple C++ Program.n”;

• 功能是在屏幕上输出一行字符串

• cout是标准输出流对象,通常代表计算机的屏幕

• std::表示cout在std命名空间中

• << 输出操作符,将右边内容输出到左边指定设备上

• n是换行符

• “;”表示本行语句结束,所有的C++语句都要以分号结束

 { }——内部是函数的主体部分

 return 0;——使主函数结束并将整数0返回给运行此程序的操作系统

• 返回0表示执行过程没有任何错误而且正常结束

• 此语句也可以省略

第七节 C++程序的开发过程

开发一个C++程序的过程通常包括编辑、编译、链接、运行和调试等步骤。

一、编辑——“编写”程序

编辑源程序文件 .cpp

编辑头文件 .h

二、编译——“翻译”程序

将C++编写的程序翻译成为机器能够读懂的语言

将源程序(.cpp)翻译为目标代码(.obj)

使用“编译器”完成此功能

三、链接

• 将目标文件与库文件链接起来,形成可以再操作系统中直接运行的可执

行程序(.exe)

• 此功能由“链接器”完成

四、运行和调试

• 检查拼写错误、语法错误、链接错误

• 检查结果的正确性

• 可以采用设置断点、单步执行、观察变量等操作来调试程序

第八节 Visual C++6.0开发环境

VC6是在集成开发环境中利用项目的概念来组织和管理程序开发工作的。

一、开发程序的一般步骤

编辑、编译、链接、执行、调试

二、集成开发环境的认识

• 项目工作区、源程序编辑窗口、输出窗口、迷你调试工具栏

• 项目(Project)——开发程序所需要的所有文件的集合

• 工作区(WorkSpace)——进行项目组织的工作空间

• 工作区文件 .dsw

• 项目文件 .dsp

三、编写C++程序的步骤

1. 创建项目——Win32 Console Application

2. 项目工作区的组成——类视图、文件视图

3. 创建头文件、创建源程序文件、创建main函数(了解类视图中图标的

结构)

4. 编译、链接、运行

本章小结

1. C++的发展、特点

2. C++的主要特征

3. C++语言的基本符号

4. C++语言的词汇(关键字、标识符、常量、运算符、标点符号等)

5. C++程序的基本框架

6. Visual C++ 6.0集成开发环境

7. 开发程序的过程:编辑、编译、链接、运行、调试

本章习题

1.下列关于面向对象概念的描述中,错误的是( )。

A. 面向对象方法比面向过程方法更加先进

B. 面向对象方法中使用了一些面向过程方法中没有的概念

C. 面向对象方法替代了结构化程序设计方法

D. 面向对象程序设计方法要使用面向对象的程序设计语言

【答案】C

【解析】面向对象是结构化程序的扩充,不是替代。

2.下列C++标点符号中表示一条语句结束的是( )。

A. #

B. ;

C. //

D. {

【答案】B

【解析】C++语句用“;”表示语句的结束,每条语句必须。

3.下列各种高级语言中,不是面向对象的程序设计语言是( )。

A. C++

B. Java

C. VB

D. C

【答案】D

【解析】C 语言是面向结构的程序设计。

4.下列下列关于对象的描述中,错误的是( )。

A. 对象是类的一个实例

B. 对象是属性和行为的封装

C. 对象就是C语言中的结构变量

D. 对象是现实世界中客观存在的某种实体

【答案】C

【解析】对象是类的具体实例化,类是对象的抽象,是用户自定义的新的

数据类型。

5.C++语言具有面向对象方法中要求的三大特性( ) 、( )和( )。

6.C++程序中,有且仅有一个( )函数

7.组成C++语言的基本符号包括字母、( )、和特殊符号。

8.C++源程序的扩展名是( ),头文件的扩展名是( )。

9.使用插入符进行标准输出文件输出时,使用的输出流对象名是( )。

【答案】

5. 继承性、封装性、多态性

6. main

7. 数字

8. cpp、.h

9. cout

第2章 数据类型、运算符和表达式[视频讲解]

考试内容要求

1. 掌握C++数据类型(基本类型、指针类型)及其定义方法

2. 了解C++的常量定义(整型、字符型、逻辑型、符号型等)

3. 掌握变量的定义,初始化和使用方法

4. 掌握C++运算符的种类,运算符优先级和结合性

5. 熟练掌握C++表达式类型及求值规则(赋值运算,算数运算,关系运算,

逻辑运算,条件运算,指针运算,逗号表达式)

第一节 C++语言的数据类型

C++每个变量或者是常量有需要拥有自己的一种数据类型。C++将数据类型

分成三种:基本类型、构造类型(包括:导出类型,自定义类型)。

一、基本类型

1. 逻辑型——BOOL布尔型,用1,0表示逻辑真假

2. 字符型——char

 取值范围包括:ASCII码集,扩充的ASCII码集的全部符号

 占1个字节,即8位

 ASCII码集中的字符和整数的对应关系

 取值范围为:0~255

3. 整型——关键字 int

 16位机,占2个字节;32位机占4个字节

 取值范围为:-32768~32767

4. 浮点型——float,double即带有小数点的数

 包括单精度和双精度

 Float占4个字节,double占8个字节,即64位空间

5. 空值型——void表示取值为空

通常用来表示函数的返回值类型,也可以声明一个指针变量 void *p; 表

示p指向的数据类型尚不确定

二、基本类型的派生类型

1. 基本类型的派生类型是指——基本类型的字长及其取值范围可以放大

和缩小,改变后的类型

2. 派生类声明符由基本类型关键字前面加上修饰符组成

 short——短类型,缩短字长

 long——常类型,加长字长

 signed——有符号类型,取值范围包括正负值

 unsigned——无符号类型,取值范围只包括正值

第二节 常量

常量是指在程序执行过程中值不改变的量。有两种表示形式:字面常量和

符号常量。

一、逻辑常量

 有两个值:true、false

 分别用1,0表示

 可以参与算数运算

 eg:BOOL b=(x==y)

二、字符常量

 简称字符:以单引号作为起止符号

 ASCII是字符范围落在字符型数据的取值范围内,所以也是字符常量

(个别字符除外)

 转义字符:用反斜杠“”引导的下一个字符失去了原来的含义,而转

义为具有某种控制功能的字符

 允许反斜杠引导一个具有1至3位的八进制整数或以x作为开始标记的

1至2位十六进制整数(‘12’,’x5A’)

三、整型常量

3131

1. 十进制整数:整数和负数,范围为-2~2-1

2. 八进制整数:以数字0开头,全部默认为正数。比如:01234、016。

3. 十六进制整数:以数字0和字母x(大小写均可)开头,全部默认为正

数。比如:0x55、0x1cd、0x50cA。

4. 整型数表示允许后面添加后缀u (无符号整型数)和l(长整型数)。比

如:15U、0x1abcL。

四、实型常量

1. 定点表示:用小数形式表示实数,小数点可以处在任何一个数字位的前

面或者是后面 .12 -.012

2. 浮点表示:以指数形式表示

 由一个十进制整数后接一个字母E(大小写均可)和一个1至3位的十

进制整数组成,

E前面的称为尾数,E后的部分称为指数

 该浮点数的值等于尾数乘以10的指数幂

 eg:3.23E5=3.23*10 5 .46e0=0.46

五、枚举常量

1. 属于用户定义类型,用enum表示

2. 用来定义程序中的需要使用的一组相关符号常量

3. 声明枚举类型的语法格式

enum <类型名>{<枚举值表>};

enum color{RED=1,YELLOW,BLUE};

4. 几点说明:

 一个枚举类型是int类型的一个子集,每一个枚举值代表一个整数

 若n个枚举值全部没有赋予常量值,它们自左向右分别于整数

0,-1对应

 若第i个枚举值常量值为m,则后续的枚举值分别与m+1,m+2对应

第三节 变量

对变量的几点说明:

 变量是程序中用于存储信息的单元,它对应于某存储空间。

 定义变量需要说明变量的数据类型和名字

 数据类型说明为变量分配多少的内存空间,以及说明我们要在这个变量

中存储什么类

型的值

 变量名可以代表存储空间,因此程序能够在变量中存储值和取出值

一、变量的定义

1. 定义的格式:

 存储类 变量类型 变量名=初始化值/初值表达式;

 默认存储类为auto

 若未赋初值,则变量的值不确定

 可以定义多个变量,各个变量之间用逗号分开

2. 变量名的命名规则:

 是一个合法的C++标识符

 不能使用C++关键字

二、变量的使用方法

1. 全局变量和局部变量

 全局变量——在所有函数定义、类定义和程序块之外声明的变量

 若没有初始化,系统会自动为其赋值为0

 在程序的任何一个函数、类或程序块之外都能访问全局变量

 局部变量——在某个函数定义、类定义和程序块之内声明的变量

 局部变量只能在声明它的局部范围内被访问

2. 生存期和作用域

 生存期——指从一个变量被声明且分配内存开始,直到该变量声明语句

失效,它占用的内存空间被释放为止

• 全局变量——从声明开始,到程序结束为止

• 局部变量——从声明开始,到包含它的最近的一个程序块结束为止

 作用域——指变量名可以代表该变量存储空间的范围

 一般情况,变量的作用域与其生存期是一致的

3. 变量的存储类属性

C++将存储方式不同将存储类别划分为4类:

 auto变量——自动变量,为变量声明时的默认存储类别

 register变量——寄存器变量,建议变量以寄存器作为存储空间

 static变量——静态变量,生命周期延续到整个程序的终止,若未赋

值,则系统赋值为0

 extern变量——外部变量,通常用于多个文件组成的程序中,多个文件

中同时被声明,却是指同一变量,可以避免为其重复分配内存

4. typedef类型说明

使用关键字typedef可以为已有类型名定义一个新类型名,为了提高代码

的可读性。

其格式为:

typedef 已有类型名 新类型名

eg:

typedef int integer;

integer a; 等价于 int a

四、符号常量声明语句

1. 声明语句格式

2. const 类型名 符号常量名 =初值表达式;

3. 必须在声明符号常量的同时为其赋初值

4. 符号常量的值为常量,以后这个值始终保持不变,即系统只允许读取它

的值,不能再次向它赋值

5. 若类型名为int ,则可以省略

6. 可以提高的程序的可读性和可维护性

举例:

已知一个三角形中三条边的长度分别为a、b和c,编写程序利用公式

求出三角形的面积,其中s=(a+b+c)/2。要求边长a、b、c的

值由键盘输入,并确保任意两边的长度之和大于等于第三条边。

编写程序:

#include

#include

using namespace std;

int main()

{

float a,b,c,s,area;

cout<<"input a,b,c:";

cin>>a>>b>>c;

s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c));

if(a+b>c && a+c>b && b+c>a)

cout<<"area="<

else

cout<<"It is not a triangle!"<

return 0;

}

第四节 运算符和表达式

一、运算符和表达式的概念

1. 基本概念:运算符、操作数,表达式

2. 运算符可以分为:单目,双目,三目运算符(只有一个是:条件运算

符 ?:)

3. 运算符可能是一个字符、两个字符,三个字符或者是关键字

二、运算类型和运算符

1. 每一种运算符和其它运算符之间的区别:

 参与运算的运算数的数量和类型

 运算结果的数据类型

 运算的具体操作:一个运算符有至少一种运算

2. 有些运算符不止有一个含义:* &等

三、赋值运算

1. 格式:变量名=表达式 ,其中“=”为赋值运算符

2. 具体操作:先计算右端表达式的值,然后把该值赋给左端变量

3. 复制表达式:由基本格式构成的式子为复制表达式

 若左右两端运算数类型相同,进行正常赋值

 若不同,右边类型转换为左边类型

 使用“=“可以是实现连续性赋值

 运算顺序为:从右向左

 复合赋值表达式

四、算术运算符和算数表达式

1. 算术运算符的种类:

 单目运算符 - ++ --

 双目算术运算符 + - * / %

 增量运算符 ++ --

• 前置型 ++i --i 先使变量加,减1,在参与其他运算

• 后置型 i++ i-- 先参与运算,再使变量的值加、减1

例如,在下面各表达式中,如果int型变量X的初始值为10,则:

++x //表达式的值为增1后的x值,即11

x++。 //x的值为11,但表达式的值仍为10

y=2*x++ //x的值为11,y的值为10

y=--x //x的值为9,Y的值为9

y=2*x++ //x的值为11,y的值为20

2. 赋值表达式

(1)int+int 结果为int

(2)float+(int/float)结果为float

(3)doule+(int/float/double) 结果为double

举例说明:

假设已指定i为整型变量,f为float变量,d为double型变量,e为long

型,有下面表达式:

10+'a'+i*f-d/e

运算次序为:

①进行10+′a′的运算,先将'a'转换成整数97,运算结果为107。

②进行i*f的运算。先将i与f都转换成double型,运算结果为double

型。

③整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加

若干个0,即

107.000…00),结果为double型。

④将变量e转换成double型,d/e结果为double型。⑤将10+'a'+i*f的

结果与d/e的商相减,结果为double型。

上述的类型转换是由系统自动进行的。

例如,在下面各表达式中,如果int型变量x和y的初始值分别为29和6,

则:

x-y //表达式的值为23

x/8//表达式的值为3

x/y+5//表达式的值为9

10-x%y//表达式的值为5

-x/5 //表达式的值为-5

如果将y看成double型变量并赋值为6.0,则:

x-y //表达式的值为23.0

x/y //表达式的值为4.83333

若要使两个整数相除得到一个实数,则必须将其中之一强制转换为实数。

例如:

float(y)/24 //表达式的值为0.25

x/double(-8)//表达式的值为-3.625

其中float(y)和double(-8)分别表示把括号内的表达式的值强制转换

为一个单精度数和双精度数。

五、关系运算符和关系表达式

1. 关系运算符:< , >, <=,>=,==,!=

2. 运算结果为逻辑型值:真和假

3. 格式为:<运算数> < 关系运算符> <运算数>

例如,在下面各表达式中,如果int型变量x的值为2,double型变量Y的

值为1.25,则:

x= =0 //不成立,表达式的值为false

x!=y //成立,表达式的值为true

x++>=3 //不成立,表达式的值为false,但x的值变为3

y+10

'a'=='A' //不成立,表达式的值为false

六、逻辑运算符和逻辑表达式

1. 逻辑运算符:&& || !

2. 运算结果为逻辑型值:真和假

3. 逻辑规则:

 &&——同时为真,取值为真,否则为假

 ||——只要有一个为真,取值为真;若全为假,取值为假

 !——假为真,真为假,即取反运算

 逻辑常量、逻辑变量、关系表达式都是逻辑型数据

在进行逻辑运算操作时,要注意:以0值为假(即false),非0值为真(即

true)。例如,下面语句段:

int a=1,b=2;

cout<<!a<<"——"<<!(a-b)<

cout<

cout<

输出结果为:

0——0

1——0

1——1

七、位运算

1. 位运算符:

 双目位运算符:& | (按位与、或) ^(按位异或) >>(按位右移)<<

(按位左移)

 单目位运算符:~(按位取反)

2. 针对运算分量的二进制进行操作

3. 异或操作:相同为0,不同为1

例如,在下面各表达式中,如果char型变量x的二进制值为00011000(即

十进制数24),char型变量y的二进制值为00100100(即十进制数36),

则:

x<<2 //表达式的二进制值为01100000

y>>3 //表达式的二进制值为00000100

x & y //表达式的二进制值为00000000

x | y //表达式的二进制值为00111100

x^44(十进制数)//表达式的二进制值为00110100

八、其他运算符

1. 条件运算符:?:

<表达式1>?<表达式2>:<表达式3>

max=a>b?a:b

2. 逗号运算符:<表达式1>,<表达式2>,….,<表达式n>,从左向右计

算,取最后一个表达式的值

y=(t=x,x+=1,t)

3. sizeof运算符:可以进行字长的提取,不同操作系统的结果不同

例如,在下面各表达式中,如果a、b都是int型变量,则:

sizeof(a) //表达式的值为4

sizeof(b) //表达式的值为4

sizeof(int) //表达式的值为4

sizeof(char) //表达式的值为1

4. 圆括号运算符()

圆括号用于函数调用 fun( )

圆括号用于强制类型转换 :(<类型名>)<表达式>

double a=3.4 (int)a

n=97 (char)n

圆括号用于类型构造:<类型名> (表达式)

double d=8.32;

int n=int (d); //n=3

类型构造在功能上等价于强制类型转换

5. 其它运算符:* & new delete 【】 ::

九、优先级和结合性

 具体见教材P31

 ()可以改变默认的运算符优先级

 若没有括号,依照运算符优先级,由高到底进行计算

 优先级相同的运算符在一起时要注意它们的结合性,依次进行计算

• 算数运算符是左结合性,即从左向右

• 赋值运算符是右结合性,即从右向左

• ! && ||

本章小结

1. C++数据类型(基本类型、指针类型)及其定义方法

2. C++的常量定义(整型、字符型、逻辑型、实型,符号型等)

3. 变量的定义,初始化和使用方法

4. C++运算符的种类,运算符优先级和结合性

5. C++表达式类型及求值规则(赋值运算,算数运算,关系运算,逻辑运

算,条件运算,指针运算,逗号表达式)

6.在32位机中,int型字宽为( )字节。

A. 2

B. 4

C. 6

D. 8

【答案】B

【解析】32位计算机整型数据占4个字节,16位机,占2个字节

7.下列十六进制的整型常数表示中,错误的是( )。

A. 0xad

B. 0X11

C. 0xA

D. 4ex

【答案】D

【解析】十六进制的整型常数表示必须用0x开头,X不区分大小写

8.设n=10,i=4,则执行赋值运算n%=i-1后,n的值是( )。

A. 0

B. 1

C. 2

D. 3

【答案】B

【解析】”%=“为取余赋值运算符,上述表达式相当于n=n%(i-1),采用右

结合性,先计算i-1,再取余数。

9.若有a=2,b=4,c=5,则条件表达式a>b?a:b>c?a:c的值为( )。

A. 0

B. 2

C. 4

D. 5

【答案】D

【解析】条件表达式采用右结合性计算

10.若有a=1,b=2,则表达式++a==b的值为( )。

A. 0

B. 1

C. 2

D. 3

【答案】B

【解析】++的优先级别高于==,++ a之后的值为2,2==2,所以表达式为真,

计算结果为1

11.C++中的基本数据类型大体上可以分成三类,它们是( )、( )和

( )。

【答案】基本类型、导出类型、用户定义类型

12.C++程序中的数据分为( )和( )两大类,其中( )是指程序执

行过程中值不改变的量。( )是程序中用于存储信息的单元,并对应于某个

存储空间。

【答案】常量、变量,常量、变量,

13.给出下列逻辑表达式的值:设a=3,b=4,c=5

①a+b>c&&b==c

②a||b+c&&b-c

③!(a>b)&&!c||1

④!(x=a)&&(y=b)&&0

【答案】逻辑与的优先级高于逻辑或 0 1 1 0

第3章 基本控制结构[视频讲解]

考试内容要求

1. 掌握C++基本语句:赋值语句,表达式语句,复合语句,输入输出语句

和空语句等;

2. 用If语句实现分支结构

3. Switch语句实现多分支选择结构

4. 用For语句、While语句、do…While语句实现循环结构

5. 转向语句:goto,continue,break,return

6. 掌握分支语句和循环语句的各种嵌套使用

C++语言提供的基本控制结构包括三种类型:

1. 顺序结构:按照先后顺序依次执行程序中的语句

2. 选择结构:按照给定条件有选择地执行程序中的语句

3. 循环结构:按照给定规则重复地执行程序中的语句

第一节 C++语句

语句以分号表示结束,C++语句的六种类型:

(1)声明语句:用于对程序中的各种实体进行声明、定义及初始化。

(2)表达式语句:用于对程序中的数据进行具体操作和处理。

(3)选择语句:用于实现程序的选择结构。

(4)循环语句:用于实现程序的循环结构。

(5)跳转语句:用于实现程序执行流程的转移。

(6)复合语句:用于表示程序中的语句块。

第二节 顺序结构

顺序结构会按照程序的书写的先后顺序,从左向右,自上而下依次执行。

一、声明语句

1. 一个名称在使用之前必须先声明

2. 作用:告诉编译器某个名称所指代的实体类型。

3. 可以再声明语句中对变量进行初始化

4. 声明语句同时也是定义语句

5. 声明语句的几种形式

 变量声明 : char ch =‘a’; double i=2.34;

 常量声明 : const int n=10; const double pi=3.14;

 函数声明 :int max(int x,int y);

 类型声明 :class student; struct date{int y,m,d};

二、表达式语句

语法格式:<表达式>;

1. 赋值操作 a=b+c; a=b=c;

2. 复合操作 a+=9; b*=c;

3. 增量、减量操作 i++; --i;

4. 函数调用操作 max(3,5); sqrt(9);

5. 输入输出操作 cout<

三、基本输入输出

I/O操作通过标准库中的输入/输出流对象来完成。

1. 标准输入输出流对象 cin cout

在头文件iostream中定义了代表屏幕的标准输出流对象cout和代表键盘

的标准输入流对象cin

2. 预处理命令

#include

using namespace std;

3. 输出操作 cout<

Expr代表一个表达式,endl是输入/输出操作符

整条语句的含义是:将表达式Expr的值输出(显示)到屏幕上当前光标所

在位置。

cout语句的一般格式为

cout<<表达式1<<表达式2<<……<<表达式n;

一个cout语句可以分写成若干行。如

cout<<"This is a simple C++ program."<

可以写成:cout<<"This is" //注意行末尾无分号

<<"a C++ "<<"program."

<

也可写成多个cout语句,即

cout<<"This is "; //语句末尾有分号

cout <<"a C++ "; cout <<"program."; cout<

以上3种情况的输出均是一致的。

4. 输入操作 cin>>Var;

Var代表一个变量,并且支持连续性输入多项数据

cin语句的一般格式为

cin>>变量1>>变量2>>……>>变量n;

举例说明输入输出语句的用法:

#include

using namespace std;

int main()

{//输出操作

cout<<"Please input 3 numbers a,b and c:";

double a,b,c;

//输入操作

cin>>a>>b>>c;

double sum=a+b+c;

//输出操作

cout<<"a="<

cout<<"The sum of a,b and c is"<

return 0;

}

该程序的执行结果是:

Please input 3 numbers a,b and e:2.5 4.2 3.3

a=2.5 b=4.2 c=3.3

The sum of a,b and c is 10

四、复合语句和空语句

1. 复合语句:用{ }将若干语句包围起来而组成的一条语句:

 函数的函数体

 循环语句的循环体

 if语句的分支

 Switch语句的执行部分

2. 空语句 ; ——不执行任何操作

第三节 选择结构

一、if语句——条件语句

1.基本if语句

 格式:if(<条件判断表达式>)<语句>

 若条件判断为真,则执行语句,否则即为假,则忽略语句

 若想执行多条语句,必须用{ }括起来,因为if语句在形式上只执行一条

语句

 条件也可以是一个声明语句,其中必须定义一个变量对其进行初始化

if(a>10)

a-=5;

a+=5;

C++中规定:如果<条件>是一个表达式,则当此表达式的值不为0时,条件

结果为“真”;只有当此表达式的值为0时,条件结果才为“假”。

例如,下面的语句

if(x)

cout<<"The value of 1/x is"<<1/x<<'\n';

只有当x的值不等于0时,才将它的倒数输出。

举例:往往要求根据某个指定的条件是否满足来决定执行的内容。例如,购

物在1000元以下的打九五折,1000元及以上的打九折。

if (amount<1000) tax=0.95;

//amount代表购物总额,tax代表折扣

else tax=0.9;

//若amount<1000,条件满足,tax=0.95,否则tax=0.9

pay=amount*tax; //pay为实付款

2.if…..else语句

格式: if(<条件判断表达式>)

<语句1>

else

<语句2>

举例:double a,b,c;

cout<<"please enter a,b,c:";

cin>>a>>b>>c;

if (a+b>c && b+c>a && c+a>b)

{ double s,area;

//在复合语句内定义变量

s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c));

cout<<"area="<

}

else

cout<<"it is not a trilateral!"<

3.if语句的嵌套

 格式: if(<条件判断表达式>)

<语句>

else

if(<条件判断表达式>)

<语句>

……

else

<语句>

 else 关键字总是与它前面最近的未配对的且可见的那个关键字if关

键字配对

举例说明:

int x=100;

if(x>0) //第一个if关键字

if(x<50) //第二个if关键字

cout<<"OK.\n";

else //else关键字

cout<<"Error.\n";

 复合语句内的if关键字对其外面的else关键字不可见

if(<条件>) //第一个if

if(<条件>){ //第二个if

if(<条件>) //第三个if

<语句>}

else <语句>

 按照规则,上面语句中的else应与第二个if配对,因为第三个if位

于复合语句中,它对else是不可见的。

 如下结构中,若某一个条件为真,则执行相应的if语句并越过剩余的

阶梯结构

举例说明:

int x;

cin>>x;

if(x>=90)

cout<<"A n";

else if(x>=80)

cout<<"Bn";

else if(x>=70)

cout<<"C\n";

cout<<"D\n";

else

cout<<"E\n";

二、switch语句——开关语句

 功能根据给定表达式不同取值来决定从多个语句序列中的哪一个开始

执行

 switch(表达式)

{case 常量表达式1:语句1;break;

case 常量表达式2:语句2; break;

...

case 常量表达式n:语句n; break;

default:语句n+1}

 表达式的值必须属于整型、字符型或枚举型

 举例:

 switch (grade)

{ case’A’: cout << "85~100n";break;

case’B’: cout << "70~84n";break;

case’C’: cout << "60~69n";break;

case’D’: cout << "<60n";break;

default: cout << "errorn";break;

}

 多个case标号可以共用一组语句序列,以实现对多个常量执行同一个

操作

 default标号是可选择的

 switch语句可以嵌套

 每一个case表达式的值必须互不相同,否则就会出现互相矛盾的现象

 各个case和default的出现次序不影响执行结果

第四节 循环结构

在人们所要处理的问题中常常遇到需要反复执行某一操作的情况。这就需

要用到循环控制。许多应用程序都包含循环。

三种循环语句:

 for语句

 while语句

 do…..while语句

一、for语句

C++中的for语句使用最为广泛和灵活,不仅可以用于循环次数已经确定的

情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,其格式为:

for(表达式1;表达式2;表达式3) 语句

(1) 先求解表达式1。

(2) 求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌

语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。

(3) 求解表达式3。

(4) 转回上面第(2)步骤继续执行。

(5) 循环结束,执行for语句下面的一个语句。

for(循环变量赋初值;循环条件;循环变量增值)

语句

for(i=1;i<=100;i++) sum=sum+i;

 一般格式中的“表达式1”可以省略,应在for语句之前给循环变量赋

初值

 如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就

是认为表达式2始终为真

 表达式3省略,但此时程序设计者应另外设法保证循环能正常结束

 可以省略表达式1和表达式3,只有表达式2,即只给循环条件

 3个表达式都可省略,即为“死循环”

 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量

无关的其他表达式。

举例1:分别计算整数1至10的平方值并输出。

int main()

{

for(int i=1;i<=10;i++)

{

cout<

//计算并输出变量i的平方值

}

cout<

return 0;

}

举例2:阅读程序,说出该程序段的功能是什么?

int main()

{

const double pi=3.14159;

for(int r=5;r>0;r--)cout<<"R="<

return 0;

}

二、While语句

 while (表达式) 语句

 其作用是: 当指定的条件为真(表达式为非0)时,执行while语句中

的内嵌语句。

 其特点是:先判断表达式,后执行语句。while循环称为当型循环。

几点说明:

 循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形

式出现。如果不加花括号,则while语句的范围只到while后面第一个分号

处。

 在循环体中应有使循环趋向于结束的语句。

举例:求1+2+3+…+100

int i=1,sum=0;

while (i<=100)

{ sum=sum+i;

i++;

}

cout<<"sum="<

三、do……While语句

do-while语句的特点是先执行循环体,然后判断循环条件是否成立。其一般

形式为

do

语句

while (表达式);

举例:

int i=1,sum=0;

do

{ sum=sum+i;

i++;

}while (i<=100);

cout<<"sum="<

比较do……While语句与While语句之间的区别

 do-while循环的循环体在前,循环条件在后,因此,语句的循环体在

任何条件下都至少被执行一次

 While循环的循环条件在前,循环体在后,当条件不满足时,循环体可

能一次也不执行。

四、循环的嵌套

一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循

环中还可以嵌套循环,这就是多层循环。3种循环可以互相嵌套。

举例说明:使用循环结构编写程序,显示如下由字符“*”组成的图形。

*

* *

* * *

* * * *

* * * * *

int main()

{

for(int i=0;i<5;i++)//外层循环

{

for(int j=0;j<=I;j++)cout<<'*';

//内层循环,输出字符'*'

cout<<'n';

//开始新行

}

return 0;

}

第五节 跳转语句

使用跳转语句可以实现程序执行流程的无条件转移。C++中提供了四种跳转

语句,分别是:

 break语句

 continue语句

 return语句

 goto语句

一、break语句

 格式为:break;

 已经介绍过用break语句可以使流程跳出switch结构,继续执行

switch语句下面的一

个语句

 实际上,break语句还可以用于循环体内。

 其作用为使流程从循环体内跳出循环体,即提前结束循环,接着执行循

环体下面的语

句。

 break语句只能用于循环语句和switch语句内,不能单独使用或用于

其他语句中。

举例说明:阅读程序,说出程序的功能是什么?

int main()

{

for(int i=1;i<10;i++){

for(int j=1;j<10;j++){

if(j==i+1 )

break; //break语句

cout<

cout<<'n'; //break跳到此处

}

return 0;

}

二、continue语句

 格式:continue;

 其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进

行下一次是否

执行循环的判定

 continue语句和break语句的区别是:continue语句只结束本次循环,

而不是终止整

个循环的执行。而break语句则是结束整个循环过程,不再判断执行循

环的条件是否

成立。

举例说明:

for(int n=1;n<=100;n++)

{

if(n%3==0)

continue;

cout<

}

程序的运行结果为:输出1~100不能被3整除的数。

三、return语句

 格式: return; 或者 return 表达式;

 只能用在函数体中

 非void返回值函数,其函数体中必须至少有一条return语句,并且使

用第二种形式,

使执行流程转移到函数调用该函数的位置,并将表达式的值作为函数的

返回值

 void返回值的函数,使用第一种形式,回到调用函数的位置

四、goto语句

 格式:goto <标号>;

 <标号>是一个用户命名的标识符,在goto语句所处函数中必须同时存

在一条由<标号

>标记的语句

 标号语句的格式:<标号>:<语句>

 goto语句的功能是:使执行流程跳转到标号所标记的语句处

举例说明:

int i=1,sum=0;

Loop: sum+=i;

i++;

if(i<100)

goto Loop;

本章小结

1. C++基本语句:赋值语句,表达式语句,复合语句,输入输出语句和空

语句等;

2. 用If语句实现分支结构

3. Switch语句实现多分支选择结构

4. 用For语句、While语句、do…While语句实现循环结构

5. 转向语句:goto, continue, break, return

6. 分支语句和循环语句的各种嵌套使用

本章习题

1.下列选项中属于C++语句的是( )。

A. ;

B. a=17

C. i+5

D. cout<<‘n’

【答案】A

【解析】C++语句必须用“;”表示结束,A选项表示的是空语句

2.下列关于语句的描述中,错误的是( )。

A.C++程序中的函数是由若干条语句组成的

B.每条语句都要实现某种操作

C.条件语句是用来实现分支操作的

D.循环语句是用来在一定条件下重复执行某段程序的

【答案】A

【解析】C++程序中的函数可以包含空语句

3.下列程序的输出结果是:

int x;

for(int i=1;i<=100;i++)

{x=i;

if(++x%2==0)

if(++x%3==0)

if(++x%7==0)

cout<

A. 39,81

B. 42,84

C. 26,68

D. 28,70

【答案】D

【解析】:考核大家对运算符的结合性和推算功能,此题倒

着往前推

4.执行完下面语句后,i,j,k的值分别是:

int a=10,b,c,d,i,j,k;

b=c=d=5;

i=j=k=0;

for(;a>b;++b)i++;

while(a>++c)j++;

do{k++;}

while(a>d++);

【答案】i的值是5,j的值是4,k的值是6

【解析】注意while循环和do….while 循环在执行次数上的差异,++符号

作为前置和后置运算符的区别

5.C++语句中用于控制程序执行流程的三种基本结构是:( )、

( )、( )

6.下列语句的输出结果是:( )

int k=1,n=10,m=1;

while(k<=n)

{ m*=2;

n--; }

cout<

答案:

5.循环结构、选择结构、顺序结构

6.注意循环条件一共执行了多少次,m的取值为1024

第4章 数组、指针与引用[视频讲解]

考试内容要求

1. 掌握一维数组的定义、初始化和访问,了解多维数组的定义、初始化和

访问

2. 了解字符串一字符数组

3. 熟练掌握常用字符串函数

4. 指针与指针变量的概念,指针与地址运算符,指针与数组

5. 引用的基本概念,引用的定义与使用

6. new delete 动态分配空间

第一节 数组

数组是有序数据的集合。要寻找一个数组中的某一个元素必须给出两个要

素,即数组名和下标。数组名和下标惟一地标识一个数组中的一个元素。

数组是有类型属性的。同一数组中的每一个元素都必须属于同一数据类型。

一个数组在内存中占一片连续的存储单元。

数组可以使一维的,也可以是多维的。

一、一维数组

1. 一维数组的定义

定义一维数组的一般格式为

数据类型 数组名[数组长度];

例如 int a[10];

它表示数组名为a,此数组为整型,有10个元素。

数组元素的下标是从0开始,到<数组长度>-1

2. 一维数组的初始化

(1) 在定义数组时分别对数组元素赋予初值。

例如

int a[10]={0,1,2,3,4,5,6,7,8,9};

(2) 可以只给一部分元素赋值,剩余的将设定为0。

例如

int a[10]={0,1,2,3,4};

(3) 如果想使一个数组中全部元素值为1,可以写成

int a[10]={1,1,1,1,1,1,1,1,1,1};

不能写成 int a[10]={1*10};

不能给数组整体赋初值。

(4) 在对全部数组元素赋初值时,可以不指定数组长度。

例如

int a[5]={1,2,3,4,5};

可以写成

int a[]={1,2,3,4,5};

3. 访问数组元素

数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次

引用整个数组中的全部元素的值。

数组元素的表示形式为

数组名[下标]

下标用于指定所访问的数组中元素的位置,它可以是整型常量或整型表达

式。[ ]为下标运算符,例如

a[0]= a[5]+ a[7]- a[2*3]

#include

using namespace std;

int main( )

{

int i,a[10];

for (i=0;i<=9;i++)

a[i]=i;

for (i=9;i>=0;i--)

cout<

cout<

return 0;

}

运行结果如下:

9 8 7 6 5 4 3 2 1 0

二、多维数组

1. 二维数组

具有两个下标的数组称为二维数组。有些数据要依赖于两个因素才能惟一

地确定,例如有3个学生,每个学生有4门课的成绩,显然,成绩数据是一个

二维表。

想表示第3个学生第4门课的成绩,就需要指出学生的序号和课程的序号

两个因素,在数学上以S3,4表示。

 定义二维数组的一般形式为

类型标识符 数组名[常量表达式1][常量表达式2]

常量表达式用来指定数组中的行和列。

例如 float a[3][4],b[5][10];

 二维数组初始化

✓ 分行给二维数组赋初值。如

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

这种赋初值方法比较直观,把第1个花括号内的数据赋给第1行的元素,

第2个花括号内的数据赋给第2行的元素……即按行赋初值。

✓ 可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初

值。如

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

效果与前相同。但以第1种方法为好,一行对一行,界限清楚。

✓ 可以对部分元素赋初值。如

int a[3][4]={{1},{5},{9}};

它的作用是只对各行第1列的元素赋初值,其余元素值自动置为0。赋初值

后数组各元素为

1 0 0 0

5 0 0 0

9 0 0 0

✓ 也可以对各行中的某一元素赋初值:

int a[3][4]={{1},{0,6},{0,0,11}};

初始化后的数组元素如下:

1 0 0 0

0 6 0 0

0 0 11 0

 访问二维数组元素

二维数组的元素的表示形式为:

数组名 [下标1][下标2]

如a[2][3]。下标可以是整型表达式,如a[2-1][2*2-1]。其中下

标1表示的为行下标,下标2表示的为列下标。

举例说明:

#include

using namespace std;

const int Rows=4;

const int Cols=4;

int main()

{

int row,col,sum;

int

matrix[Rows][Cols]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

//输出该二维数组

for(row=0;row

for(col=0;col

(5);

cout<

}

cout<

}

//按行计算元素之和

for(row=0;row

{

sum=0:

for(col=0;col

sum+=matrix[row][col];

cout<<"Sum of the"<

}

//按列计算元素之和

for(col=0;col

sum=0;

for(row=0;row

sum+=matrix[row][col];

cout<<"Sum of the"<

}

//计算对角线元素之和

sum=0;

for(row=0;row

SLIm+=matrix[row][row];

cout<<"Sum of the main diagonal:"<

//计算反对角线元素之和

sum=0;

for(row=0;row

SLim+=matrix[row][Rows-1-row];

cout<<"Sum of the opposite diagonal:"<

return 0;

}

运行结果是:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

Sum of the l row:10

Sum of the 2 row:26

Sum of the 3 row:42

Sum of the 4 row:58

Sum of the 1 col:28

Sum of the 2 col:32

Sum of the 3 col:36

Sum of the 4 col:40

Sum of the main diagonal:34

Sum of the opposite diagonal:34

2. 多维数组

 定义多维数组的一般形式为

类型标识符 数组名[常量表达式1][常量表达式2]…..

n]

 访问多维数组的一般形式

数组名 <表达式1> <表达式2>….. <表达式n>

[常量表达式

 采用for循环来处理多维数组

3. 字符数组

(1)string类型

 string是一种用户自定义的数据类型,由C++标准库来支持

 在使用string 类型之前,需要在程序中包含头文件string并声明其

所在的命字控件std

#include

using namespace std;

 string name="wangwu";

(2)字符数组

 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个

字符。

 符数组具有数组的共同属性

 C和C++专门为它提供了许多方便的用法和函数

 字符数组用char 类型表示 : char s[100];

 空字符(’0’)用来最为一个字符串结束的标志

 字符串以空字符结尾,即字符串的最后一个字符总是空字符,而字符数

组可以不含空字符

 字符数组的特点:

• 数组元素跟一般变量一样可以赋值、比较、计算等

• 数组下标也是从0~N-1

• 字符数组长度可以显示给出,也可以隐式得到

• 用字符串对数组初始化时,编译程序以’0’作为结束这个数组的标志。

因此,数组长度至少比字符串长度多1

(3)常用字符串函数

 字符串操作的函数都包含在头文件CString中

 字符串复制函数strcpy:char * strcpy(char *,char *)

 字符串连接函数strcat:char * strcat(char *,char *)

 字符串比较函数strcmp: int strcmp(char *,char *)

 字符串长度函数strlen: int strlen(char *)

 字符串查找函数strstr:char * strstr(char *,char *)

举例说明:

char s1[80],s2[80];

strcpy(s1,"C++");

strcpy(s2,"is power programming.");

cout<<"lengths:"<

cout<<""<

if(!strcmp(s1,s2))cout<<"The strings are equal\n";

else cout<<"not equal\n":

strcat(s1,s2);

cout<

strcpy(s2,s1);

cout<

if(!strcmp(s1,s2))cout<<"s1 and s2 are now the same.n";

if(strstr(s1,"Java")==NULL)cout<<"Not found!"<

运行结果是:

lengths:421

not equal

C++is power programming.

C++is power programming.and C++is power programming.

S1 and s2 are now the same.

第二节 指针

一、了解指针的基本概念

在高级语言编程中,面对的是变量名,而源程序经过编译系统处理后,每

一个变量在程序执行前将分配在内存指定的位置上。程序执行中,计算机是到

与变量名对应的内存地址去处理存储在其中的数据。

这种按变量的地址直接存取变量的方法称为“直接访问”方式。存储变量的

内存空间的首地址称为该变量的地址。

如果将一个变量的地址放在另一个变量中,则存放地址的变量称为指针

(Pointer)型变量。这时存取变量,也可以间接的由指针变量取得该变量的地址

进行,这称为“间接访问”方式。

由于指针变量中的值是另一个变量的地址,因此习惯上形象地称为指针变

量指向该变量。

指针变量中的值也简称为指针,所以指针就是地址。

 指针变量声明的格式

数据类型 * 指针变量名;

• int * p;

• char *p;

“*”不是指针变量名的一部分,在定义变量时在变量名前加一个“*”表

示该变量是指针变量。

举例说明:

int *p;

int x=37;

cout<<"Line 1:x="<

p=&x;//Line 2

cout<<"Line 3:*p=*<<*p<<",x="<

*p=58;//Line 4

cout<<"Line 5:*p="<<*p<<",x="<

cout<<"Line 6:Address of p="<<&p<

tout<<"Line 7:Value of p="<

cout(<"Line 8:Value of the memory location"

<<"pointed to by *p="<<*P<

cout(<"Line 9:Address of x="<<&x(

cout<<"Line 10:Value of x="<

二、指针和地址

1. 指针说明

 C++中有两个专门的运算符与指针有关。

• “&”取地址运算符,作用于内存中一个可寻址的数据(如:变量,对

象和数组元素等),操作的结果是获得该数据的地址。运算结果不可作

为左值。

• “*”指针运算符,作用于一个指针类型的变量,访问该指针所指向的

内存数据。因结果是内存中可寻址的数据,所以它可以作为左值。

 常见的指针类型

• int *p; 指向整型变量的指针

• char *p 指向字符型变量的指针

• char *p【10】; 由指向字符的指针构成的数组,即指针数组

• char (*p)【10】; 指向字符数组的指针,即数组指针

• int (*p)( );指向返回值为整型变量的函数的指针,即函数指针

2. 指针的运算

 指针和整型量可以进行加减

指针变量与整型量的加减表示移动指针,以指向当前目标前面或后面的若

干个位置的目标。指针与整型量i的加减等于指针值(地址)与i*sizeof (目

标类型)积的加减,得出新的地址

int a [10] = {1,2,3,4,5,6,7,8,9,10};

int *p;

p = a;

p++; 指向数组的第二个元素

• p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元

• *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。

举例说明:

int a[10]={0,1,2,3,4,5,6,7,8,9};

double b[10]={9,8,7,6,5,4,3,2,1,0};

int *p1=a;

double *p2=b;

int i;

for(i=0;i<10;i++)

{

cout<

}

 同类型指针之间可以进行赋值:p2=p1; 两个指针指向同一片地址空间

• 两个指针指向同一片地址空间,若其中一个被删除或释放,则另一个指

针所指空间也被删除,这就是指针悬挂问题

• 在释放一个指针所指的空间时,一定要确保所指的空间的指针已不再需

要,以防止指针悬挂

举例:指针悬挂问题

#include

#include

using namespace std;

void sp(char *s);

int main()

{ char *p;

p=new char[100];

strcpy(p,"C++ Language.");

sp(p);

cout<<"p的输出:"<

return 0;}

void sp(char *s)

{cout<<"s的输出:"<

delete s;

}

 两个指向同一类型的指针,可以进行==,>,<等关系运算,其实是地址之

间的比较。

int a[5]={0,1,2,3,4},temp,i;

int *p=a;

for(i=0;i<5;i++)

{

cout<<*(p+i)<<" ";

}

cout<

int *q=a+4;

for(i=0;i<5;i++)

{

if((p+i)<(q-i))

{ temp=*(p+i);

*(p+i)=*(q-i);

*(q-i)=temp;

}

cout<<*(p+i)<<" ";

}

cout<

 两个指向同一数组成员的指针可以进行相减,但是不能相加,结果为两

个指针之间相差元素的个数

• p指向数组的头部,q指向数组的尾部,则q-p+1表示数组的长度

• 计算中间指针的值的方法:mid=low+(high-low)/2

 几种常见的指针运算表达式的比较

• p++和p+1的区别

• y=*p+1和 y=*(p+1)的区别

• y=(*p)++和y=*p++的区别

• 区别主要在p指针的位置是否发生变化

3. 指针和数组

数组的参数传递、数组元素的存取,都可以通过指针操作来完成。指针和

数组常常可以互换。

 数组名代表数组首元素的地址

int a【10】,x;

int * p;

p=a=&a【0】;

x=*p; x=a【0】; x=*a; 三条语句等价

x=*(p+i); x=a【i】; x=*(a+i); 三条语句等价

 字符串常量,可以看成是一个无名的字符数组,C++编译程序会自动为

它分配一个空间来存放这个常量,字符串常量的值本身是指向数组的第一个字

符的指针,其类型是字符指针。

char *s;

s="ABCDEFGHIGKLMNOPQRSTUVWXYZ";

举例说明:用5种方法对一个数组求和。

int sum1=0,sum2=0,sun13=0,sum4=0,sum5=0;

//存放每种方法的结果

int iArray[ ]={1,4,2,7,13,32,21,48,16,30};

//全局数组

int*iPtr;

int main()

{

int size,n;

size=sizeof(iArray)/sizeof(*iArray);//数组元素个数

f*r(n=0;n

iPtr=iArray;

for(n=0;n

iPtr=iArray;

for(n=0;n

iPtr=iArray;

for(n=0;n

for(n=0;n

cout<

<

<

<

<

return 0;

}

程序运行结果为:

174

174

174

174

174

第三节 引用

一、引用的概念

对一个数据可以使用“引用”,这是C++对C的一个重要扩充,引用是一种

新的变量类型,它的作用是为一个变量起一个别名。假如有一个变量a,想给它

起一个别名b,可以这样写:

int a; //定义a是整型变量

int &b=a; //声明b是a的引用

以上语句声明了b是a的引用,即b是a的别名。经过这样的声明后,a或

b的作用相同,都代表同一变量。

 &是引用声明符,并不代表地址

 声明变量b为引用类型,并不需要另外开辟内存单元来存放b的值

 b和a占内存中的同一个存储单元,它们具有同一地址

 使用引用应该遵守的规则:

• 创建引用时,必须立即对话进行初始化

• 一旦一个引用被初始化为一个对象的引用,它就不能被改变为另一个对

象的引用

• 不可能有NULL引用

二、用引用传递函数参数

C++把引用型变量作为函数形参,弥补了变量作为函数参数以及指针作为函

数参数的局限性。

第四节 动态存储分配

一、静态存储分配

指在程序运行前,即编译时,系统对变量分配的存储空间。

二、动态存储分配

指程序中所需要的内存数量只有等到运行时才能确定下来,动态分配的存储

空间闲置不用时,需要对其进行释放。动态存储分配功能在C++中通过new

和delete运算符来实现。

1. 使用new获得动态内存空间

运算符new用于申请动态分配空间,它的操作数为某种数据类型且可以带

有初值表达式或元素个数,new返回一个指向其操作数类型变量的指针,其语法

格式为:


发布者:admin,转转请注明出处:http://www.yc00.com/web/1714375396a2434790.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信