习题六参考答案.pdf_第1页
习题六参考答案.pdf_第2页
习题六参考答案.pdf_第3页
习题六参考答案.pdf_第4页
习题六参考答案.pdf_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题六 1 举例说明什么是指针?如何让指针指向一个变量? 答: 在 C 语言中,一个程序对象的开始存储地址也是一种数据,这种数据也能存于变量中,这种 数据的类型是一种指针类型。专用于存储指针类型值的变量称为指针变量,简称指针。 设有一个 int 类型的变量 k,一个能存储 int 类型变量指针值的指针变量 intPt,则只要将变 量 i 的地址赋给 intPt,就能让 intPt 指向变量 i,如以下代码所示: Int I, *intPt; /定义整型变量 i 和整型指针变量 intPt intPt = /把变量 i 的地址赋给变量 intPt,使 intPt 指向 i 2 举例说明指针的定义和引用指针及引用指针所指变量的方法? 答: 以下代码定义两个整型变量 i 和 j,两个整型指针变量 iPt 和 jPt,并让这两个指针变量 iPt 和 jPt 分别指向两个整型变量 i 和 j,然后通过指针变量 iPt 和 jPt 间接引用整型变量 i 和 j。 Int I = 2, j=3, *iPt, jPt; /定义整型变量 i 和 j,整型指针变量 iPt 和 jPt iPt = jPt = /指针变量 iPt 和 jPt 分别指向整型变量 i 和 j *iPt = *jPt+*iPt+5; /使变量 i 的值为 10 iPt = jPt; /让指针变量 iPt 也指向变量 j 3 举例说明指针与数组名之间的联系与区别。 答: 当指针指向数组的元素时,指针能如同数组哪样使用,由于指针是变量,其值能改变,能使 它指向数组的别的元素。但数组名只能表示数组首元素的指针,并且不能改变。以下代码用 指针求数组元素的和: int a = 1, 2, 3, 4, 5, *pt , s; for(s=0, pt = a; pt = pt+) s += *pt; 4 试指出让一个字符指针指向字符串的首字符与用数组存储一个字符串的区别。 答:在 C 语言中,字符串最终存于一个字符数组中。通过数组元素的引用方法,可以引用字 符数组中的字符串的每个字符, 也可通过指向字符串某个字符的字符指针引用字符串的每个 字符, 由于字符指针有简单的运算, 在编写字符串处理程序时, 用字符指针可能更简便一些。 在 C 程序中,程序直接用数组存储字符串时,这个数组一定是程序定义的,如让字符指针指 向字符串首字符, 这个指针所指向的可能是程序定义的字符数组的某个字符, 也可能是程序 中出现的字符串常量的首字符。 5 指针赋值应注意哪些问题? 答: 给指针赋值有两种可能目的,一是为指针设定初值,二是改变指针的值,让它不再指向原来 它指向的变量,而让它指向另一个变量。对于后者,要防止指针原来所指的如果是一个动态 变量,并且只有这个指针指向它。这样的改变就让哪个动态变量不再有指针指向它。如果发 生这种情况,这上动态变量就成为程序无法访问的变量。 6 什么情况下需要为函数设置指针形参? 答: 在 C 程序中,通过函数调用改变调用环境中的变量值有 3 种常用方案。一是使用全局变量, 函数执行直接改变全局变量。 这种有副作用的方案是程序设计中使用最少的。 二是由调用环 境把函数调用的返回结果保存于某个变量中, 这种函数本身不直接影响调用环境的方案是程 序设计使用最多的,因为这种方案程序安全性最好,这样的程序也最容易调试。三是函数设 置指针形参, 函数调用将值可能要改变的变量的指针传递给函数的指针形参, 而函数通过指 针形参间接引用环境中的变量,可以访问其值,也可改变其值。 与第一种方案相比较, 第三种方案比较明确, 并且更灵活。 当函数要改变调用环境中的变量, 并且可由调用者随意指定时,就需要设置指针形参。 对应 C 语言的第 3 种方案,在 C+程序中,函数可设置引用形参,其优点是在书写形式上较 C 语言的指针形参更简便。函数内不再简接引用形参所指的变量,调用时也不再需要提供变 量的指针,直接用变量名即可。 7 函数指针有何作用? 答: 由于函数指针也是变量,能让它在不同时刻指向不同的函数,这样,同样的函数间接调用代 码能调用不同的函数。 8 如何使用函数指针? 答: 在相对比较复杂的情况,函数要调用别的函数,并且这个被调用的函数能由调用环境指定, 函数就需要设置函数指针形参。调用这样的函数时,需提供一个函数指针,被调用函数就可 利用这个函数指针简接调用函数。例如,迭代法求实函数根的函数,迭代法求根函数是按求 根算法编写的函数, 一般的实函数都能用这个函数求根, 则这个求根函数应有一个函数指针 形参。 9 试指出以下代码的意义: (1)int a10; (2)int b3=1, , , 4, 2; (3)int *p; (4)int (*q); (5)int (*u)(int, int); (6)int *v(int, int); (7)int *(*w)(int, int); 答: (1)定义有 10 个整型数据组成的数组,数组的名为 a; (2) 定义一个4行3列的两维整型数组b, 并初始化为 b00为 1, b30为 4, b41 为 2,b 的其余元素都为 0. (3)说明标识符 p 是一个指针数组,它的元素是能指向整型数据的指针。 (4)说明标识符 q 是一个指针,它能指向的是数组,数组的元素是整型的。 (5)说明标识符 u 是一个指针,它能指向的是函数,要求函数有两个整型形参,并返 回整型结果。 (6)说明标识符 v 是一个函数,它有两个整型形参,并返回整型结果。 (7)说明标识符 w 是一个指针,它能指向的是函数,要求函数有两个整型形参,并返 回整型指针结果。 10试指出以下程序运行时的输出内容: (1) #include void main() char * appt; char *a=ABCD, UVW, XYZ; appt=a; cout *appt endl; cout *appt endl; cout *(appt+1) endl; cout *(*(appt+2)+2) endl; (2) #include void main() float score4=60, 70, 80, 90, 50, 60, 70, 80, 90, 88, 35, 77, 77, 90, 100, 60; float *search(float(*pt)4); float *p; int k, j; for(k=0; k4; k+) p=search(score+k); if(p=*(score+k) cout No. k+1 SCORE: endl; for(j=0; j4; j+) cout *(p + j) ; cout endl; float *search(float(*pt)4) int k; float *p=NULL; for(k=0; k4; k+) if(*(*pt+k)60) p=*pt; return p; 答: (1) ABCD A UVW Z (2) No.2 SCORE: 50 60 70 80 No.3 SCOPE: 90 88 35 77 11有若干个学生,每人考 4 门课程,设用二维数组存储学生的成绩,二维数组的一行对应 一个学生的成绩,每行的第一个数是学生的学号。试以此数据结构为基础,编写两个函 数。一个是已知成绩表和学号,返回该生成绩表的函数。另一个是已知某个学生表,输 出学生学号和成绩的函数。要求两个函数采用指针编写。 答: #include typedef int (*sTbl)5;/单个学生成绩单类型 int scoreTbl5 = /全体学生成绩表 1, 50, 60, 70, 80, 2, 60, 70, 80, 90, 3, 70, 80, 90, 100 ; /* 已知成绩表和学号,返回该生成绩表的函数。 */ int* searchSTbl(int allSTbl5, int n, int no) for(sTbl i = (sTbl)allSTbl0; i = (sTbl)allSTbln-1; i+) if(*i = no) return *i; return NULL; /* 已知某个学生成绩单,输出学生学号和成绩的函数。 */ void outScore(int * spt) if(spt = NULL) return; printf(学号:%dn, *spt); for(int *p = spt+1;p spt+5; p+) printf(课目%d:%dn, p - spt, *p); void main() int n; printf(输入学生的学号: ); scanf(%d, outScore(searchSTbl(scoreTbl, 3, n); 12用指针编写在数组中查找指定值指针的函数。 答: int a, b, c, x, y, z; int *intPtArray = /一个预定义的指针数组 int *searchPt(int *ptA, int n, int *pt) /在数组中查找指定值指针的函数 for(int*i = ptA; i ptA+n; i+) if(*i = pt) return *i; return NULL; void init(int start)/为变量初始化 int *p; for(p = intPtArray; p intPtArray +6; p+) *p = start+; 13用指针编写删除字符串中重复字符的函数。 答: #include char str = ABCDEFGHABCDEIJKLMNOPQRSTSTUVWXYZUVWCDEFGHIJKGHIJKLMNOPQRST; char *clearStr(char *s) char *ch, *p, *q; for(p = q = s; *p; p+) for(ch = s; ch q; ch+) if(*ch = *p) break; if(ch = q) *q+ = *p; *q = 0; return s; void main() printf(%sn, clearStr(str); 14分别编写 4 个函数,计算两个整数的和、差、积、商。主函数提供一个菜单,能让使用 者指定运算, 主函数根据用户的指定选取函数的指针, 并以函数指针为实参调用计算函 数 execute()完成计算。 答: #include double add(double x, double y) return x+y; double sub(double x, double y) return x-y; double mul(double x, double y) return x*y; double div(double x, double y) if(y = 0)return 1.0E+30; return x/y; int main() double(*fpt)(double , double)= add, sub, mul, div; char *menuName=和, 差, 积, 商, ; int ans, k; double a, b; while (1) printf(请选择以下菜单命令。n); for(k=0; menuNamek0 !=0 ; k+) printf(t%d:求%sn, k+1, menuNamek); printf(t 其他选择结束程序运行。n); scanf(%d, if (ansk) break; printf(输入两个运算数: n); scanf(%lf%lf, printf(nt%s=%fn, menuNameans-1, (*fptans-1)(a, b); return 0; 15写出以下函数的功能 char *strpos(char *s, char *t) char *j, *k; for(; *s; s+) for(j = s, k = t; *k j+, k+) ; if (k != t return NULL; 答: 函数在参数 1 字符串中寻找字符串 2 的第一次出现。找到时,返回找到处的首字符指针。如 果没有找到,返回空指针。 16写出以下程序的输出结果 #include int a = 2, c = 4; f(int a, int *x) int b = 10; static int c = 20; b += a+; c += a + b; *x = c+2; void main() f(a, printf(In main(1): a = %d, c = %dn, a, c); f(3+c, printf(In main(2): a = %d, c = %dn, a, c); 答: In main(1): a = 2, c = 37 In main(2): a = 128, c = 37 17编写输入,输出和排序 3 个函数。3 个函数都以指针数组和数组元素个数为形参,分别 实现将一组离散的变量顺序输入,输出和从小到大排序。 答: #include int a, b, c, d, e, f; void input(int *pt, int n) printf(为%d 个离散整型变量输入值n, n); for(int *k=pt; k pt+n; k+) scanf(%d, *k); void output(int *pt, int n) for(int *k=pt; k pt+n; k+) printf(%dt, *k); printf(n); void sort(int *pt, int n) for(int *k=pt+1, *end = pt+n; k 0; k-, u += n+1) for(p = u, q = p+n-1, j = k; j 0; j-, q+=n, p+) t = *p; *p = *q; *q = t; (2)字符串中的字符个数。 设字符串首字符指针为 str,字符个数统计于变量 c。 for(char *p = str; *p; p+) ; c = p-str; (3)将字符串 s2 中的前 n 个字符复制到字符数组 s1。 char *p = s1, *q = s2; int k = 0; while(k+ = a (6)整理字符串,将字符串中前导和后随的空白符删去,字符串中间连续的多个空白 符只保留一个,去掉多余的空白符。 参见习题四的小题 16 的解: int s = 0; for(char *p = str, *q = str; *p; p+) if(*p != *q+ = *p; s = 1; else if(s = 1) s = 2; *q = 0; 19试分别指出以下代码的正确性。如果正确,说明其意义;如果不正确,说明其原因。 (1)int x; int (2)int y; int int (3)int *p; int * int u=9; q= (4)void (5)int b10; int (6)int 答: (

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论