当前位置:文档之家› C++第5章习题解答

C++第5章习题解答


(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)整体
return 0; } 5.4 将[例5.5]改用一维数组,附加行、列参数,实现通用算法。 解:用一维数组,附加行、列参数,实现通用算法难度大。 #include <iostream> #include <iomanip> using namespace std; void inverse(int [], int [],int,int);//注意数组最高维可缺省,例5.5因初学未 省 void multi(int [], int [], int [],int,int,int); void output(int [],int,int); int main(){ int middle[6*3], result[6*4];//注意写作6*3等可清楚看出矩阵的行列 int matrix1[3*6]={8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6}; int matrix2[3*4]={3,2,1,0,-1,-2,9,8,7,6,5,4}; output(matrix1,3,6); inverse(matrix1,middle,3,6); output(middle,6,3); output(matrix2,3,4); multi(middle,matrix2,result,6,3,4); output(result,6,4); return 0; } void inverse(int matrix1_1[],int middle_1[],int a,int b){ int i,j; for (i=0;i<a;i++) for (j=0;j<b;j++) middle_1[i+j*a]=matrix1_1[i*b+j]; return; } void multi(int middle_1[],int matrix2_1[],int result_1[],int a,int b,int c){ int i,j,k; for (i=0;i<a;i++){ for (j=0;j<c;j++){ result_1[i*c+j] = 0; for (k=0;k<b;k++)
答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大 小作为参数传递。也可以用一维数组加各维的大小都作为参数传递。 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 指针作为函数的参数时,它传递的是什么?实参要用什么?而使 用引用时实参要用什么?何时只能用指针而不能用引用? 答:是地址,是指针所指向的变量或对象的内存首地址,在物理上讲我
二、编程与综合练习题
5.3 打印杨辉三角形(10行)。使用二维数组并利用每个系数等于其肩 上两系数之和。 解:好的算法无特例,二维数组共用11列,第1列全0,方便计算 #include<iostream> using namespace std; int main(){ int a[10][11]={0,1},i,j; //初始化时写好第1行,其余各行全0 for(i=1;i<10;i++) //为了全部算法无特例,共用11列,第1列全 0,方便计算 for(j=1;j<=i+1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10;i++){ for(j=1;j<=i+1;j++) cout<<a[i][j]<<'\t'; cout<<endl; }
第五章 数组与指针习题
一、.基本概念与基础知识自测题
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)最高维(第一维)
result_1[i*c+j]+=middle_1[i*b+k]*matrix2_1[k*c+j]; } } return; } void output(int max_1[],int a,int b){ for (int i=0;i<a;i++){ for (int j=0;j<b;j++) cout <<setw(4)<<max_1[i*b+j]<<" "; cout<<'\n'; } cout<<endl; return; } 5.5 编写函数int atoi(char s[ ]),将字符串s转化为整型数返回。注意负数 处理方法。 解:用指针处理字符串非常方便。使用符号位来处理负数。 #include<iostream> using namespace std; int atoi(char s[]){ int temp=0,f=1,i=0; while(s[i]!='\0'&&s[i]!='-'&&(s[i]<'0'||s[i]>'9')) i++;//去除串前部无效字 符 if(s[i]=='-'){//读负号 f=-1; i++; } if(s[i]<'0'||s[i]>'9') cout<<"error!"<<endl;//串非法时,输出提示,返回0 while(s[i]>='0'&&s[i]<='9'){//转换数字串 temp=temp*10+s[i]-48; i++; } return f*temp; } int main(){ char num[20];
相关主题