习题六-参考答案

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

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 <stdio.h> 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("%s\n", clearStr(str)); } 14.分别编写 4 个函数,计算两个整数的和、差、积、商。主函数提供一个菜单,能让使用 者指定运算, 主函数根据用户的指定选取函数的指针, 并以函数指针为实参调用计算函 数 execute()完成计算。 答: #include <stdio.h> 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;
(7)说明标识符 w 是一个指针,它能指向的是函数,要求函数有两个整型形参,并返 回整型指针结果。 10.试指出以下程序运行时的输出内容: (1)
#include <iostream.h> 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; }
} 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; menuName[k][0] !='\0' ; k++) printf("\t%d:求%s\n", k+1, menuName[k]); printf("\t 其他选择结束程序运行。\n"); scanf("%d", &ans); if (ans<1 || ans>k) break; printf("输入两个运算数: \n"); scanf("%lf%lf", &a, &b); printf("\n\t%s=%f\n", menuName[ans-1], (*fpt[ans-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 ; j++, k++) ; if (k != t && *k == ‘\0’) return s; } return NULL; } 答: 函数在参数 1 字符串中寻找字符串 2 的第一次出现。找到时,返回找到处的首字符指针。如 果没有找到,返回空指针。 16.写出以下程序的输出结果 #include <stdio.h> int a = 2, c = 4; f(int a, int *x) { int b = 10; static int c = 20; b += a++; c += a + b;
习题六
1. 举例说明什么是指针?如何让指针指向一个变量? 答: 在 C 语言中,一个程序对象的开始存储地址也是一种数据,这种数据也能存于变量中,这种 数据的类型是一种指针类型。专用于存储指针类型值的变量称为指针变量,简称指针。 设有一个 int 类型的变量 k,一个能存储 int 类型变量指针值的指针变量 intPt,则只要将变 量 i 的地址赋给 intPt,就能让 intPt 指向变量 i,如以下代码所示: Int I, *intPt; //定义整型变量 i 和整型指针变量 intPt intPt = &I; //把变量 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 = &I; jPt = &j; //指针变量 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 <=&a[4]; pt++) s += *pt; 4. 试指出让一个字符指针指向字符串的首字符与用数组存储一个字符串的区别。 答:在 C 语言中,字符串最终存于一个字符数组中。通过数组元素的引用方法,可以引用字 符数组中的字符串的每个字符, 也可通过指向字符串某个字符的字符指针引用字符串的每个 字符, 由于字符指针有简单的运算, 在编写字符串处理程序时, 用字符指针可能更简便一些。 在 C 程序中,程序直接用数组存储字符串时,这个数组一定是程序定义的,如让字符指针指 向字符串首字符, 这个指针所指向的可能是程序定义的字符数组的某个字符, 也可能是程序 中出现的字符串常量的首字符。 5. 指针赋值应注意哪些问题? 答: 给指针赋值有两种可能目的,一是为指针设定初值,二是改变指针的值,让它不再指向原来 它指向的变量,而让它指向另一个变量。对于后者,要防止指针原来所指的如果是一个动态 变量,并且只有这个指针指向它。这样的改变就让哪个动态变量不再有指针指向它。如果发 生这种情况,这上动态变量就成为程序无法访问的变量。
Байду номын сангаас
答: (1) ABCD A UVW Z (2) No.2 SCORE: 50 60 70 80
No.3 SCOPE: 90 88 35 77 11.有若干个学生,每人考 4 门课程,设用二维数组存储学生的成绩,二维数组的一行对应 一个学生的成绩,每行的第一个数是学生的学号。试以此数据结构为基础,编写两个函 数。一个是已知成绩表和学号,返回该生成绩表的函数。另一个是已知某个学生表,输 出学生学号和成绩的函数。要求两个函数采用指针编写。 答: #include <stdio.h> typedef int (*sTbl)[5];//单个学生成绩单类型 int scoreTbl[][5] = { //全体学生成绩表 {1, 50, 60, 70, 80}, {2, 60, 70, 80, 90}, {3, 70, 80, 90, 100} }; /* 已知成绩表和学号,返回该生成绩表的函数。 */ int* searchSTbl(int allSTbl[][5], int n, int no){ for(sTbl i = (sTbl)allSTbl[0]; i <= (sTbl)allSTbl[n-1]; i++) if(**i == no) return *i; return NULL; } /* 已知某个学生成绩单,输出学生学号和成绩的函数。 */ void outScore(int * spt) { if(spt == NULL) return; printf("学号:%d\n", *spt); for(int *p = spt+1;p < spt+5; p++) printf("课目%d:%d\n", p - spt, *p); } void main(){ int n; printf("输入学生的学号: "); scanf("%d", &n); outScore(searchSTbl(scoreTbl, 3, n)); } 12.用指针编写在数组中查找指定值指针的函数。 答: int a, b, c, x, y, z; int *intPtArray[] = { &a, &b, &c, &x, &y, &z};//一个预定义的指针数组 int *searchPt(int *ptA[], int n, int *pt){ //在数组中查找指定值指针的函数
(2)
#include <iostream.h> void main() { float score[][4]={{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; k<4; k++) { p=search(score+k); if(p==*(score+k)) { cout << "No." << k+1 << " SCORE:" << endl; for(j=0; j<4; j++) cout << *(p + j) << " "; cout << endl; } } } float *search(float(*pt)[4]) { int k; float *p=NULL; for(k=0; k<4; k++) if(*(*pt+k)<60) p=*pt; return p; }
6. 什么情况下需要为函数设置指针形参? 答: 在 C 程序中,通过函数调用改变调用环境中的变量值有 3 种常用方案。一是使用全局变量, 函数执行直接改变全局变量。 这种有副作用的方案是程序设计中使用最少的。 二是由调用环 境把函数调用的返回结果保存于某个变量中, 这种函数本身不直接影响调用环境的方案是程 序设计使用最多的,因为这种方案程序安全性最好,这样的程序也最容易调试。三是函数设 置指针形参, 函数调用将值可能要改变的变量的指针传递给函数的指针形参, 而函数通过指 针形参间接引用环境中的变量,可以访问其值,也可改变其值。 与第一种方案相比较, 第三种方案比较明确, 并且更灵活。 当函数要改变调用环境中的变量, 并且可由调用者随意指定时,就需要设置指针形参。 对应 C 语言的第 3 种方案,在 C++程序中,函数可设置引用形参,其优点是在书写形式上较 C 语言的指针形参更简便。函数内不再简接引用形参所指的变量,调用时也不再需要提供变 量的指针,直接用变量名即可。 7. 函数指针有何作用? 答: 由于函数指针也是变量,能让它在不同时刻指向不同的函数,这样,同样的函数间接调用代 码能调用不同的函数。 8. 如何使用函数指针? 答: 在相对比较复杂的情况,函数要调用别的函数,并且这个被调用的函数能由调用环境指定, 函数就需要设置函数指针形参。调用这样的函数时,需提供一个函数指针,被调用函数就可 利用这个函数指针简接调用函数。例如,迭代法求实函数根的函数,迭代法求根函数是按求 根算法编写的函数, 一般的实函数都能用这个函数求根, 则这个求根函数应有一个函数指针 形参。 9. 试指出以下代码的意义: (1)int a[10]; (2)int b[][3]={{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, 并初始化为 b[0][0]为 1, b[3][0]为 4,b[4][1]
为 2,b 的其余元素都为 0.
(3)说明标识符 p 是一个指针数组,它的元素是能指向整型数据的指针。 (4)说明标识符 q 是一个指针,它能指向的是数组,数组的元素是整型的。 (5)说明标识符 u 是一个指针,它能指向的是函数,要求函数有两个整型形参,并返 回整型结果。 (6)说明标识符 v 是一个函数,它有两个整型形参,并返回整型结果。
相关文档
最新文档