C++第5章习题解答

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章数组与指针习题

一、.基本概念与基础知识自测题

5.1 填充题

5.1.1 数组定义时有三个要素:数组名,数组元素的(1)和数组元素的(2)。按元

素在数组中的位置进行访问,是通过(3)进行的,称为(4)或(5)访问。

为了使数组声明中数组的大小修改更为方便,总是将(6)用于声明数组长度。

答案:(1)类型

(2)数量

(3)下标运算符

(4)下标

(5)索引

(6)常变量

5.1.2 C/C++中的多维数组用的是一个(1)的定义,即多维数组的基本定义是(2)构

成的数组,三维数组的元素是(3)。

答案:(1)嵌套

(2)以数组作为元素

(3)二维数组

5.1.3 计算机内存是一维编址的,多维数组在内存中的存储(1),C/C++多维在内存中

的排列是(2)方式,即越(3)的下标变化(4)。设数组a有m行n列,每个元素占内存u个字节,则a[i][j]的首地址为(5)+ (6)。

答案:(1)必须要转化为一维方式,

(2)按行方式

(3)右

(4)越快

(5)a数组的首地址

(6)(i*n+j)*u

5.1.4 对于多维数组,(1)的大小是确定的,所谓“不检查数组边界”只是不检查(2)

的边界,而(3)的边界是在控制之中的,所以多维数组名作为函数的参数只可以(4)缺省。

答案:(1)较低各维的

(2)最高维(第一维)

(3)较低各维

(4)最高维

5.1.5 指针变量保存了另一变量的(1)值,不可以任意给指针变量赋一个地址值,只能赋

给它(2)和(3)的地址。使用变量名来访问变量,是按(4)来直接存取变量称为(5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6)方式。

答案:(1)地址

(2)NULL

(3)已经分配了内存的变量的地址

(4)按变量的地址

(5)直接访问

(6)间接访问

5.1.6 固定指向一个对象的指针,称为(1),即(2),定义时const放在(3)。

而指向“常量”的指针称为(4),指针本身可以指向别的对象,但(5),定义时const放在(6)。

答案:(1)指针常量

(2)指针本身是常量

(3)const放在类型说明之后,变量名之前

(4)常量指针

(5)不能通过该指针修改对象

(6)const放在类型说明之前

5.1.7 数组名在表达式中被自动转换为指向(1)的指针常量,数组名是地址,但数组名

中放的地址是(2),所以数组名(3)。这样数组名可以由(4)来代替,C++这样做使用时十分方便,但丢失了数组的另一要素(5),数组名是指向数组(6)的指针,而不是指向数组(7)的。编译器按数组定义的大小分配内存,但运行时对(8)不加检测,这会带来无法预知的严重错误。

答案:(1)数组第一个元素

(2)不可改变的

(3)称指针常量

(4)指针

(5)数组元素的数量

(6)元素

(7)整体

(8)对数组的边界不加检测

5.1.8 有一个三维数组:

int z3d[2][3][4];

给出指向三维数组第i行第j列第k页元素的指针的三种表达方式(1),(2),(3)。再给出这些元素的三种表达方式(4),(5),(6)。

答案:(1)z3d[i][j]+k或&z3d[i][j][k]

(2)*(z3d[i]+j)+k

(3)*(*(z3d+i)+j)+k

(4)z3d[i][j][k]或*(z3d[i][j]+k)

(5)*(*(z3d[i]+j)+k)

(6)*(*(*(z3d+i)+j)+k)

5.2简答题

5.2.1 物理上,C++是怎样访问数组元素的?请对访问方法作简单介绍。

答:物理上,C++语言的下标运算符[ ]是以指针作为操作数的,a[i]被编译系统解释为*(a+i),即表示为a所指(固定不可变)元素向后第i个元素。无论我们是以下标方式或指针方式存取

数组元素时,系统都是转换为指针方法实现。这样做对多维数组尤其方便。

5.2.2 什么是回溯算法?

答:回溯法是对枚举法的一种改进。回溯法的基本思想是,通过对问题的分析找出解决问题的线索,先在一个局部上找出满足问题条件的局部的解,然后逐步由局部解向整个问题的解的方向试探,若试探成功就得到问题的解,试探失败逐步向后退,改变局部解再向前试探。回溯法能避免枚举法的许多不必要的搜索,使问题比较快地得到解决。

5.2.3 用数组名作为函数的参数时,可否加上数组的长度?如果需要加则怎样加?为什么?答:被调函数中作为形式参数的一维数组不需要说明长度,即使说明了大小也不起作用,因为C++只传递数组首地址,而对数组边界不加检查。

5.2.4 需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数组的信息全部传递到函数中去?

答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。也可以用一维数组加各维的大小都作为参数传递。

5.2.5 解释运算符“*”和“&”的作用,运算符“.”和“->”的作用。

答:在应用指针变量时,“*”是间接引用(dereference)运算符,作用于一个指针类型的变量,访问该指针所指向的内存数据。因结果是内存中可寻址的数据。“&”是取地址运算符,作用于内存中一个可寻址的数据(如:变量,对象和数组元素等等),操作的结果是获得该数据的地址。

运算符“.”和“->”是成员访问运算符(Member Access Oprator)。在对象或结构外部去访问公有的数据成员或函数成员时,是在对象名后加“.”(点操作符),再加成员函数名或函数名就可以了。但是这些成员必须是公有的成员,只有公有成员才能在对象的外面对它进行访问。当用指向对象和结构变量的指针访问其公有成员时,则只要在指针变量名后加“->”(箭头操作符),再加公有成员名就可以了。

5.2.6 什么是this指针?简述它的作用。

答:当我们在对象的外部访问该对象的公有成员时,必须指明是哪一个对象。但是当我们用对象的成员函数来访问本对象的成员时,在成员函数中只要给出成员名就可以实现对该对象成员的访问。但同一个类创建的多个对象共用同一份成员函数的拷贝。既然是同一份拷贝,那么成员函数又怎么知道是取哪一个对象的成员数据呢?其实每一个对象有一个隐藏的this指针,它始终指向该对象,并将该指针作为一个参数自动传递给该成员函数。这就是说,成员操作符总是要使用的,只不过在对象内是隐式的,即在对象内省略了this指针。

5.2.7 指针变量与整型量的加减运算代表什么意义?

答:指针变量与整型量的加减表示移动指针,以指向当前目标前面或后面的若干个位置的目标。指针与整型量i的加减等于指针值(地址)与i*sizeof(目标类型)积的加减,得出新的地址。

5.2.8 设a为数组名,那么a++是否合法?为什么?

答:非法。因为a是指针常量。

5.2.9 指针作为函数的参数时,它传递的是什么?实参要用什么?而使用引用时实参要用什

相关文档
最新文档