如何用指向函数的指针替换switch-case
教材课后题答案-第6章_指针习题答案

习题解答一、单项选择题1.若定义了int n=2, *p=&n, *q=p;则下面【】的赋值是非法的。
A.p=qB. *p=*qC. n=*qD. p=n【答案】D2.若定义了double *p, a;则能通过scanf函数给输入项读入数据的程序段是【】。
A.p=&a; scanf(“%1e”,p);B. *p=&a; scanf(“%1f”,p);C. p=&a; scanf(“%f”,p);D. p=&a; scanf(“%1f”,a);【答案】C3.若定义了int a[10], i=3, *p; p=&a[5];下面不能表示为a数组元素的是【】。
A.p[-5]B. a[i+5]C. *p++D. a[i-5]【答案】D4.若有如下定义:int n[5]={1,2,3,4,5},*p=n;则值为5的表达式是【】。
A.*+5B. *(p+5)C. *p+=4D. p+4【答案】C5.设变量b的地址已赋给指针变量ps,下面为“真”的表达式是【】。
A.b==&psB. b==psC. b==*psD. &b==&ps【答案】C6.设有以下定义和语句:int a[3][2]={1,2,3,4,5,6},*p[3];p[0]=a[1];则*(p[0]+1)所代表的数组元素是【】。
A.a[0][1]B. a[1][0]C. a[1][1]D. a[1][2]【答案】C7.若定义了char *str=”Hello!”;下面程序段中正确的是【】。
A.char c[ ], *p=c; strcpy(p,str);B.char c[5], *p; strcpy(p=&c[1],&str[3]);C.char c[5]; strcpy(c,str);D.char c[5]; strcpy(p=c+2,str+3);【答案】B8.若有下面的程序段,则不正确的fxy函数的首部是【】。
(完整版)专升本C语言真题(20200804115730)

}
printf(“%d,%d,%d\n”,m,row,column);
}
4.程序:
#include<stdio.h>
int p(int k,int a[])
{int m,i,c=0;
for(m=2;m<=k;m++) for(i=2;i<m;i++)
{if(!(m%i)) break;
10、 在C语言中,要求运算数必须是整型的运算符是()
A.%B./C.<D.!
11、为表示关系x>y>z,应使用的C语言表达式是()
A.(x>=y)&&(y>=z)B.(x>=y) AND (y>=z)
C.(x>=y>=z)D.(x>=y)&(y>=z)
12、有以下程序段
int k=0,a=3,b=4,c=5; k=a>c?c:k;执行该程序段后,k的值是( )
}
A.k=11,k=12,k=11 B. k=11,k=13,k=13
C. k=11,k=013,k=0xb D. k=11,k=13,k=b
2.main()
{int y=10;
while(y--);
printf(“y=%d\n”,y);
}
A.y=10 B.y=1 C.y=随机值D.y=-1
3.main()
A.3B.2C.1D.0
13、若有定义char *s=””Name\\Address\n”,则指针s所指字符串长度为( )
A.19B.15C.18D.说明不合法
14、下述对C语言字符数组的描述中错误的是()
C++对象指针转换

在C++中存在两种转换:隐式转换和显式转换(强制转换)。
一、隐式类型转换C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上。
隐式类型转换发生在下列这些典型的情况下;1、在混合类型的算术表达式中。
在这种情况下,最宽的数据类型成为目标转换类型。
这也被称为算术转换arithmetic conversion 例如:int ival = 3;double dval = 3.14159;// ival 被提升为double 类型: 3.0 (是一种保值转换)ival + dval;2、用一种类型的表达式赋值给另一种类型的对象。
在这种情况下,目标转换类型是被赋值对象的类型。
例如,在下面第一个赋值中文字常量0 的类型是int 它被转换成int*型的指针表示空地址在第二个赋值中double 型的值被截取成int 型的值。
// 0 被转换成int*类型的空指针值int *pi = 0;// dval 被截取为int值3 (这不是保值转换),一般情况下编译器会给出warning.ival = dval;3、把一个表达式传递给一个函数调用,表达式的类型与形式参数的类型不相同。
在这种情况下,目标转换类型是形式参数的类型。
例如:extern double sqrt( double );// 2 被提升为double 类型: 2.0cout4、从一个函数返回一个表达式,表达式的类型与返回类型不相同。
在这种情况下,目标转换类型是函数的返回类型。
例如:double difference( int ival1, int ival2 ){// 返回值被提升为double 类型return ival1 - ival2;}二、显示转换(强制转换)(一)、旧式强制类型转换:由static_cast,cons_cast 或reinterpret_cast 强制转换符号语法,有时被称为新式强制转换符号,它是由标准C++引入的。
C++常用符号

精心整理页脚内容+、-、*、/解释:C 语言的运算符——加、减、乘、除。
+=、-=、*=、/=、%=解释:C 语言的运算符——修改和替代。
.解释:C 语言的运算符——结构或联合的成员选择。
,解释:~解释:*解释:!解释:&解释:&&%解释:;解释::::++--=解释:C 语言的①运算符——赋值。
②分隔符——用于分隔变量说明和初始化表。
==解释:C 语言的运算符——等于。
!=解释:C 语言的运算符——不等于。
>=解释:C 语言的运算符——大于等于。
>解释:C 语言的运算符——大于。
精心整理页脚内容<=解释:C语言的运算符——小于等于。
<解释:C语言的运算符——小于。
->解释:C语言的运算符——指向结构(C++语言中的类)成员的指针引用。
<<解释:C语言的运算符——字位左移。
>>解释:C语言的运算符——字位右移。
^解释:C语言的运算符——按位异或。
|解释:||[](){}(类型名\\\0\a\b\n\r\t解释:C语言的转义(换码)序列——制表符。
abstract解释:Java类修饰符(定义类时用),表示该类是一个抽象类,不能直接产生该类的一个对象。
auto解释:C语言的存储类区分符(一种说明区分符)。
break解释:C语言的转移语句——终止执行switch语句,或跳出循环语句。
case解释:C语言的标号。
用于开关语句中。
.char解释:C语言的数据类型区分符(说明区分符)。
定义单字节变量。
class解释:C++语言的合成类型区分符(说明区分符)。
说明“类”类型。
const解释:C++语言的类型区分符(说明区分符)。
continue解释:C语言的转移语句——跳过位于continue后面的语句,立即开始下一轮循环。
default解释:C语言的标号。
用于开关语句中。
delete解释:C++语言的释放内存语句。
double解释:C语言的数据类型区分符(说明区分符)。
易语言指针调用方法

易语言指针调用方法在易语言中,指针是一个非常重要的概念,它可以用来实现各种高级的操作。
指针是一个变量,它存储的是另一个变量的地址。
通过指针,我们可以访问和修改另一个变量的值。
在本文中,我们将介绍如何使用指针来调用函数和方法。
首先,我们需要了解指针的类型。
在易语言中,指针有两种类型,分别是整型指针和字符型指针。
整型指针指向一个整数变量的地址,而字符型指针指向一个字符变量的地址。
我们可以使用以下语句声明一个指针变量:整型指针:Dim p As Integer字符型指针:Dim p As Char接下来,我们将介绍如何使用指针来调用函数和方法。
调用函数要使用指针来调用函数,我们需要先将函数的地址保存到指针变量中。
以下是一个简单的例子:Function Test(a As Integer, b As Integer) As IntegerReturn a + bEnd Function'声明一个指向Test函数的指针Dim p As Integerp = GetFuncAddress('Test')'调用Test函数Dim result As Integerresult = CallFuncByAddr(p, 1, 2)Print(result)在上面的例子中,我们使用GetFuncAddress函数来获取Test函数的地址,并将其保存到指针变量p中。
然后,我们使用CallFuncByAddr函数来调用Test函数,并传递参数1和2。
最后,我们将Test函数返回的结果打印出来。
调用方法要使用指针来调用方法,我们需要先获取类的实例对象的地址,并将其保存到指针变量中。
以下是一个简单的例子:Class TestClassMethod TestMethod(a As Integer, b As Integer) As Integer Return a + bEnd MethodEnd Class'创建一个TestClass的实例对象Dim obj As New TestClass'获取TestClass实例对象的地址Dim objAddr As IntegerobjAddr = ObjToPtr(obj)'声明一个指向TestMethod方法的指针Dim p As Integerp = GetMethodAddress(objAddr, 'TestMethod')'调用TestMethod方法Dim result As Integerresult = CallMethodByAddr(p, objAddr, 1, 2)Print(result)在上面的例子中,我们创建了一个TestClass的实例对象,并将其保存到obj变量中。
c语言 重命名替换库函数 -回复

c语言重命名替换库函数-回复C语言是一种流行的程序设计语言,广泛用于各种领域的软件开发。
C 语言提供了丰富的标准库函数,这些函数可以帮助开发人员完成各种常见的任务。
然而,有时候我们需要对这些库函数进行一些修改或替换,以满足特定需求。
本文将介绍如何在C语言中重命名和替换库函数。
一、为什么需要重命名和替换库函数?在实际的软件开发过程中,我们有时会遇到一些特殊的情况,需要对库函数进行修改或替换。
这些情况可能包括以下几种:1. 与其他库函数冲突:在某些情况下,我们引入了一个新的库函数,但是它与某个已经存在的库函数名字相同,这就会导致冲突。
为了解决这个问题,我们需要对其中一个库函数进行重命名。
2. 功能扩展或改进:有时候我们需要对某个库函数的功能进行扩展或改进,以满足特定需求。
这可能需要对函数进行修改或完全替换。
3. 库函数不可用:在某些嵌入式系统或特定的环境下,一些标准的库函数可能不可用。
这就需要我们自己实现一个替代的函数。
二、重命名库函数的步骤如果我们需要对某个库函数进行重命名,可以按照以下步骤进行:1. 确定要重命名的函数:首先,我们需要确定要重命名的函数是哪个。
这可能是由于与其他函数冲突或者需要修改函数功能。
2. 找到函数的定义:然后,我们需要找到该函数的定义和声明。
这通常可以在相应的头文件或库文件中找到。
我们需要确保我们找到了所有相关的定义和声明。
3. 修改函数的名字:一旦我们找到了函数的定义和声明,我们可以将函数的名字修改为我们希望的新名字。
这个新名字不能与其他函数或变量冲突,最好是具有描述性和一致性的。
4. 修改函数的调用:接下来,我们需要在代码中将函数的所有调用处修改为新的函数名字。
这可能需要在整个项目中进行全局搜索替换。
5. 编译项目并测试:完成上述步骤后,我们需要编译整个项目,并进行测试以确保重命名的函数没有引入新的问题。
三、替换库函数的步骤如果我们需要替换某个库函数,可以按照以下步骤进行:1. 确定要替换的函数:首先,我们需要确定要替换的函数是哪个。
C语言程序设计教程(第5版)王秀鸾第10章函数参数传递进阶

10.6 main( )函数的形参
主函数的原形如下: main(int argc,char *argv[]) { … }
其中,argc和argv就是main()函数的形参。argc 是整形变量,argv[]是一个字符型指针数组。
main( )函数是由操作系统调用的,它的参数由操 作系统传递,所以运行带形参的主函数时,必须在 操作系统命令状态下,输入命令行:
第10章 函数参数传递进阶
10.1 指针变量作为函数参数
• 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指
针类型数据。
【例10.1】交换两个指针变量所指向的变量的值
#include "stdio.h" void test(int *p1,int *p2) /* 形参为指针变量 */ { int p;
} int add(int a,int b) { return(a+b); }
3.指向函数指针变量作函数参数
指向函数的指针变量也可以作为函数的参数;即 将函数的入口地址传递给函数,也就是将函数名传 给形参,从而实现利用相同的函数调用语句调用不 同函数的目的。
【例】 用函数指针变量实现四则运算。
#include "stdio.h" double add(double x,double y) { return(x+y);} double sub(double x,double y) { return(x-y);} double mult(double x,double y) { return(x*y);} double divi(double x,double y) { return(x/y);} double result(double x,double y,doubl
C语言switchcase圈复杂度优化重构

C语⾔switchcase圈复杂度优化重构软件重构是改善代码可读性、可扩展性、可维护性等⽬的的常见技术⼿段。
圈复杂度作为⼀项软件质量度量指标,能从⼀定程度上反映这些内部质量需求(当然并不是全部),所以圈复杂度往往被很多项⽬采⽤作为软件质量的度量指标之⼀。
C语⾔开发的项⽬中,switch/case代码块是⼀个很容易造成圈复杂度超标的语⾔特性,所以本⽂主要介绍下降低switch/case圈复杂度的重构⽅法(如下图)。
switch圈复杂度优化重构可分为两部分:程序块的重构和case的重构。
程序块重构是对代码的局部优化,⽽case重构是对代码的整体设计,所涉及的重构⼿段也各不相同。
程序块重构程序块重构指的是每个case内的代码段重构。
Martin Fowler 的《》()书中总结了80多种重构⽅法。
书中针对每种技术都给出了⽰例说明,另外、还提供了其他语⾔的⽰例和进⼀步介绍。
因为存在⼤量⽰例,所以本⽂针对这些⽅法不再给出⽰例,有兴趣的同学可以通过上⾯⼏种途径了解学习。
不过这些技术中有些是改善代码的可读性,有些是改善代码的可扩展性,并不是每项技术都能有效减低圈复杂度。
其中可以降低圈复杂度的⽅法有如下⼏种:提炼函数(Extract Method)。
你有⼀段代码可以被组织在⼀起并独⽴出来。
将这段代码放进⼀个独⽴函数中,并将函数名称解释该函数的⽤途。
分解条件表达式(Decompose Conditional)。
你有⼀个复杂的条件(if-then-else)语句。
从if、then、else三分段落中分别提炼出独⽴函数。
合并条件表达式(Consolidate Conditional Expression)。
你有⼀系列条件测试,都得到相同结果。
将这些测试合并为⼀个条件表达式,并将这个条件表达式提炼成为⼀个独⽴函数。
合并重复的条件⽚段(Consolidate Duplicate Conditional Fragments)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序中当switch-case里面有很多分支,且每个分支有很多操作要做时,会花费很多时间,优化的方法有很多,比如将可能性大的放在前
面,将case操作压缩,其实,最好的方法利用指向函数的指针解决问题,下面我们来看一个例子:
先来一个switch-case的模板:
view plaincopy to clipboardprint?
1. #include
2. #include
3.
4. enum MsgType{ Msg1=1 ,Msg2 ,Msg3 ,Msg4 };
5.
6. int menu()
7. {
8. int choice;
9. printf("1.ADD/n");
10. printf("2.DEL/n");
11. printf("3.SORT/n");
12. printf("4.exit/n");
13. printf("input your choice:/n");
14. scanf("%d",&choice);
15. return choice;
16. }
17.
18. void ADD()
19. {
20. NULL;
21. //
22. }
23.
24. void DEL()
25. {
26. NULL;
27. //
28. }
29.
30. void SORT()
31. {
32. NULL;
33. //
34. }
35.
36. int main()
37. {
38. while(1)
39. {
40. switch(menu())
41. {
42. case Msg1:
43. ADD();
44. break;
45. case Msg2:
46. DEL();
47. break;
48. case Msg3:
49. SORT();
50. break;
51. case Msg4:
52. exit(0);
53. break;
54. default:
55. printf("input error/n");
56. break;
57. }
58. }
59. return 0;
60. }
61.
62.
那我们怎样将这个switch-case的模板改成利用指向函数的指针解决的问题呢?答案就在下面:
view plaincopy to clipboardprint?
1. #include
2. #include
3.
4. void ADD();
5. void DEL();
6. void SORT();
7. void EXIT();
8.
9. void (*MsgFunc[])()={ ADD ,DEL ,SORT ,EXIT };
10.
11. int menu()
12. {
13. int choice;
14. printf("1.ADD/n");
15. printf("2.DEL/n");
16. printf("3.SORT/n");
17. printf("4.EXIT/n");
18. printf("input your choice:/n");
19. scanf("%d",&choice);
20. return choice-1;
21. }
22.
23. int main()
24. {
25. while(1)
26. {
27. MsgFunc[menu()]();
28. }
29. return 0;
30. }
31.
32. void ADD()
33. {
34. NULL;
35. //
36. }
37.
38. void DEL()
39. {
40. NULL;
41. //
42. }
43.
44. void SORT()
45. {
46. NULL;
47. //
48. }
49.
50. void EXIT()
51. {
52. exit(0);
53. }
54.
55.
这样,就用指向函数的指针解决了switch-case,且代码量也变少了,程序模块化也变清晰了。在编程中要充分利用这些知识来优化程
序。