c语言编程习题和答案

2024-10-23

c语言编程习题和答案(共7篇)

c语言编程习题和答案 篇1

一、判断题

1.格式字符%md中的m不能为负。(×)2.实际上,可以用顺序、分支、循环三种结构构造任何算法。()3.printf(“%d”,sizeof(1234));其结果是4。(×)4.在C语言中,任何一个表达式的最后加上一个分号就构成一个合法的语句。()

二、单选题

1.下述程序的输出结果是(B)

#include

void main()

{int a,b,c=241;

a=c/100%9;

b=-1&&-1;

printf(“%d,%d”,a,b);

} 2.若有定义:int x,y;char a,b,c;并有以下输入数据:x=1 2 A B C,则能给x赋整数1,给赋整数2,给a赋字符A,给b赋字符B,给c赋字符C的正确程序段是(D)A)scanf(“x%d y=%d”,&x,&y);

a=getch();b=getch();c=getch();B)scanf(“x=%d%d”,&x,&y);

a=getch();b=getch();c=getch();C)scanf(“x=%d%d%c%c%c”,7x,&y,&a,&b,&c);D)scanf(“x=%d%d%c%c%c%c%c”,&x,&y,&a,&b,&b,&c,&c);3.已有定义double d,f;数据的输入方式为:3.45 1.2 根据定义和数据的输入方式,输入函数调用语句的正确形式为(A)A)scanf(“%lf%lf”,&d,&f)B)scanf(“%f%f”,&d,&f)

5.下面程序执行结果是32768。(×)

main()

{int a,b;

printf(“%dn”,b=(a=32767,a+1));}

C)scanf(“3.2f%3.1f”,&d,&f)D)scanf(“%3.2lf%3.1lf”,&d,&f)4.如下程序: #include

void main()

{ int m,n,k;

m=(n=4)+(k=10-7);

printf(“m=%dn”,m);

}

运行后m的值为(C)。

(A)(B)(C)7

(D)14

5.下面程序的输出是(C)。

#include

void main()

{ int x=10,y=3;

printf(“%dn”,y=x/y);

}

(A)0

(B)

1(C)3(D)不确定的值

6.下面程序运行情况是(D)。

#include

void main()

{ int x=3,y=0,z=0;

if(x=y+z)

printf(“****”);

else

printf(“####”);

}

(A)有语法错0不能通过编译

(B)输出****

(C)可以通过编译,但不能通过连接,因而不能运行

(D)输出#### 7.结构化程序的三种基本结构是(A)。(A)顺序结构、选择结构、循环结构

(B)递归结构、循环结构、转移结构

(C)嵌套结构、递归结构、顺序结构

(D)循环结构、转移结构、顺序结构

8.以下程序的输出结果是(B)。#include main(){ int i=010,j=10;

printf(“%d,%d”,++i,j--);}(A)11,10

(B)9,10

(C)010,9

(D)10,9 9.运行完下列程序后,在屏幕上的内容是(D)。main(){ int a=0;

a+=(a=12);

printf(“%dn”,a);} 10.语句printf(“s=%-5.3s”,“computer”);的输出结果是(B)。

A)s= com B)s=com

C)s= ter D)s=ter

11.下面程序的输出是(C)

main()

{int

x=10,y=3;

printf(“%dn”,y=x/y);

}

A)0

B)C)

3D)不确定的值 12.执行下面程序中输出语句后,a的值是(C)。

main()

{ int

a;

printf(“%dn”,(a=3*5,a*4,a5));

}

A)65 B)20

C)1

5D)10 13.下列程序的输出结果是(A)。

main()

{int a=-1,b=1,c;

c=(a++<=0)&&!(b--<=0));

printf(“%d,%d,%d”,a,b,c);}

A)0,0,1

B)-1,1,1

C)0,1,0

D)0,0,0

14.以下程序运行后,m的值为(C)。

#include

void main()

{ int m,n,k;

m=(n=4)+(k=10-7);

printf(“m=%dn”,m);}

A)B)3

C)7

D)14

15.下面程序的输出结果是(D)。

main()

{int x=10;

printf(“%dn”,~x);}

A)9

B)-9

C)11

D)-11 16.以下程序的输出结果是(D)。

main()

{int x=10,y=10;

printf(“%d,%dn”,x--,--y);}

A)10,10

B)9,9

C)9,10

D)10,9 A.B.C.D.17.printf函数中用到格式符%5s,其中数字5表示输出的字符串占用5列,如果字符串长度大于5,则输出按方式(B)。

A)从左起输出该字符串,右补空格

B)按原字符长从左向右全部输出

C)右对齐输出该字串,左补空格

D)输出错0信息

18.putchar函数可以向终端输出一个 D A)整型变量表达式值

B)实型变量值 C)字符串

D)字符或字符型变量值

19.根据定义和数据的插入方式,输入语句的正确形式为(B)。

已有定义:float f1,f2;数据的输入方式:4.52

3.5 A)scanf(“%f,%f”,&f1,&f2);B)scanf(“%f%f”,&f1,&f2);C)scanf(“%3.2f %2.1f”,&f1,&f2);D)scanf(“%3.2f%2.1f”,&f1,&f2);20.已知ch是字符型变量,下面不正确的赋值语句是(A)。

A)ch='a+b'

B)ch='O';

C)ch='7'+'9';D)ch=5+9;

21.假设int a=4;以下不正确的语句是(A)。

A)a+1=4;

B){a+++ +4;a/=4}

C);

D)printf(“a+1=4”);22.如下程序的执行结果是(B)。

main()

{ int x=023;

printf(“%dn”,--x);}

A)17

B)18

C)23

D)24 23.以下程序的输出结果是(D)。

main()

{char x=040;

printf(“%dn”,x=x<<1);}

A)100

B)80

C)120

D)64

24.假如一个整型变量的最大允许值为32767,那

么运行如下程序后屏幕上会输出的结果是(B)

main()

{ int a,b;

a=32767;

b=a+1;

printf(“%d,%d”,a,b);

}

A)32767,32768 B)32767,-32768 C)

32767,0 D)运行时报错

25.已知字母A的ASCII码为十进制的65,下面程序的输出是C main()

{ char ch1,ch2;ch1='A'+'5'-'3';

ch2='A'+'6'-'3';

printf(“%d,%cn”,ch1,ch2);

}

A)67,D

B)B,C

C)C,D

D)不确定的值

26.请读程序片段:int i=65536;printf(“%dn”,i);上面程序片段的输出结果是(B)。A)65536

B)0

C)有语法错0,无输出结果

D)-1 27.在下列程序段中:

int x, y;

scanf(“%3d*2d%d”,&x,&y);

若输入的数据为:12345678,则x、y的值分别为(B)。

A)123,456

B)123,678

C)12345 678

D)无法得到正确的值

28.有如下程序,输入数据12 345后,y的值是(B)。

#include main(){ int x;float y;

scanf(“%3d%f”,&x,&y);}

(A)12.000000

(B)345.000000

(C)12345.000000

(D)0.000000 29.有如下程序,若要求a1,a2,c1,c2的值分别为10,20,A,B,正确的数据输入是(D)

main()

{int a1,a2;

char c1,c2;

scanf(“%d%d”,&a1,&a2);

scanf(“%c%c”,&c1,&c2);

}(A)1020AB

(B)10 20AB(C)10 20 AB

(D)10 20AB 30.下列语句的输出为(A)。

int x=-1;

printf(“%d,%u,%o”,x,x,x);

A)-1,65535,177777

B)-1,-1,-1 C)-1,32767,-177777

D)-1,32768,177777

31.若有定义int a=3;则执行完printf(“%d”,-a--);语句后,a 的值为(B)。

A)-

3B)

2C)-2

D)3 32.以下程序的输出结果是(C)。int x=3,y=4;void main(){ int x,y=5;

x=y++;

printf(“%d”,x);}

A)3

B)

4C)

5D)6

33.设有如下定义:int x=10,y=3,z;则语句:

z=(x%y,x/y));

printf(“%dn”,Z);

的输出结果是(D)

A)B)0

C)4

D)3

34.以下程序的输出结果是(D).main()

{ int a=3;

printf(“%dn”,(a+a-=a*a));}

A)-6

B)12

C)0

D)–12

35.设有定义:int x=1,y=-1;则语句:

printf(“%dn”,(x--&++y);的输出结果是(B).A)1

B)0

C)-1

D)2

36.设有如下定义: int x=10,y=3,z;则语句: printf(“%dn”,z=x%y,x/y));的输出结果是

(D)。

A)1

B)0

C)4

printf(“n=%dn”,n);}

A)30

B)24

C)60

D)48 D)3

42.下面程序的运行结果是(B)

37.下列程序的输出结果是(A)

main()

main()

{ double

{int x=0,y=0;

while(!x)y+=++x;

printf(“%dn”,y);

}

d=3.2;

int x,y;

x=1.2;

y=(x+3.8)/5.0;

printf(“%d n”, d*y);

}

A)3

B)3.2

C)0

D)3.07

38.已知E的ASCII码是69,则执行以下语句的结果是(A)。

printf(“%c”,'D'-'8'+'5');

A)66

B)A

C)B

D)E 39.执行下面程序后,n的值为(C)。

main()

{int n,a=2,b=3,c=4;

n=(a

n=(n>b)?b:c;

n=(n

A)5

B)4

C)3

D)2 40.以下程序执行完后,a 的值为(C)

#inlcude

void main()

{int a;

printf(“%dn”,(a=3*5,a*4,a+5));}

A)65

B)20

C)15

D)10 41.下面程序的运行结果是(B)

main()

{int n;

(n=6*4,n+6),n*2;

A)1

B)0

C)控制表达式非法

D)程序执行无限次

43.下面程序的运行结果是(B)

main()

{int n,a=2,b=3,c=4;

n=(a

n=(n>b)?b:c;

}

A)5

B)4

C)3

44.以下程序的运行结果为

(C)

。D)2

main()

{unsigned a=3,b=10;

printf(“%dn”,a<<2|b>>1);}

A)3

B)10

C)13

D)14 45.以下程序的运行结果为(A)。

main()

{int x=17,y=26;

printf(“%d”,y/=(x%=6));}

A)5

B)8

C)2

D)26 46.以下程序的输出是(B).

main()

{int a,b,d=241;

a=d/100%9;

b=(-1)&&(-1);

printf(“%d,%dn”,a,b);}

A)6,1

B)2,1

C)6,0

D)2,0 47.下列程序段的输出结果是(A)。

int x=1 , y=1 , z;z=1||++x&&y--;

printf(“n%d,%d,%d”,x,y,z);

A)1,1,1

B)2,0,1

C)2,1,1

D)2,0,0

48.下列程序的运行结果是(B).

#include

main()

{unsigned a,b,c;

a=0x255;b=a<<4;

x=(~b)&0xff;

printf(“%f”,x);}

a++<=25&&b--<=2&&c++

?

A)0x55

B)0xaf

C)0x50

pritnf(“%d,%d,%dn”,a,b,c):printf(“%d,%d,%dn”,a,b,D)0xda 49.若有定义int a=25,b=14,c=19;则以下三目运算符构成的语句的执行结果是(B)

三、多选题

1.结构化程序设计思想应该包括(ABCD)。

(A)使用顺序、分支、循环三种基本结构;(B)限制使用goto语句;

(C)应该使用自顶向下、逐步求精的方法;(D)应该使用模块化的方法;

(E)编码过程中,变量名的命名只要程序员自己明白就可以了;

c);

A)25,14,19

B)26,13,19

C)25,13,19

D)26,14,19 2.2.对于scanf()函数,下列说法正确的是(ABD)。

A)如果相邻格式符之间没有数据分隔,则对应的输入数据之间可用空格、回车分隔。B)输入数据时不能指定精度。

C)在用格式说明符“%c”输入单个字符时,空格字符和转义字符是无效字符,即不能被输入。D)遇到空格、或者回车时,系统认为一个数据输入结束。

3.3.已知ch是字符型变量,下面正确的赋值语句是(BC)。

A)ch='123';

B)ch='xff';

C)ch='t';

D)ch=“";

4.4.若有定义int a,b;float x;,则以下不正确的赋值语句是(ACD)。

A)a=1,b=2,B)b++;

C)a=b=

5D)b=int(x);

四、填空题

1.在C语言中没有固有的输入和输出语句,但是用C语言编写的程序可以用函数调用的形式来实现输入、输出,这些函数由(标准I/O库/系统)提供。

2.语句printf(”%d“,(a=2)&&(b=-2));的输出结果是____1________。3.执行以下程序段后,a 的值是______1____.int a;a=-2*4%-5/2;

五、阅读程序

1.下列程序的运行结果是(3 2 1).

main()

{int x=1;

{int x=2;

{int x=3;

printf(”%d“,x);

}

printf(”%d“,x);

}

printf(”%d",x);

}

c语言编程习题和答案 篇2

1 汇编语言和C语言的特点

1.1 汇编语言

汇编语言是人们基于初级计算机语言,也就是二进制语言的基础,将原本“0”和“1”组成的二进制字符串,换用较符合人类思维逻辑的符号来表达,比如,用“ADD”代表加法指令,用“ADC”代表加进位的加法指令,用“INC”代表加1指令,以更简明的方式来表达指令要求的符号化计算机语言。

由于符号化表达更符合人类思维逻辑的特征,也更易读易编写,汇编语言比二进制语言更易理解,人们在编程时更容易及时发现错误并修正错误,且后期的软件维护也变得相对简单。根据计算机的硬件系统来编制完成的汇编语言程序,可以将计算机不能识别的汇编语言翻译成计算机可以识别的二进制语言,从而完成信息指令的传输。用汇编语言进行编程时,数值运算比较复杂,数据处理的工作量大而繁琐。但汇编语言的优点在于编程效率高,可以充分发挥计算机硬件系统的功能,程序相对精准简练,软件质量比较高,所以汇编语言依旧是现在进行软件开发的重要工具。

1.2 C语言

C语言是面对过程的程序语言,摆脱了对计算机硬件系统的依赖,移植性比较强,在不同型号的计算机上都已成功移植,应用范围广且数据处理能力强。加上C语言处理数据的灵活性强,在各领域的实际软件应用编程时都普遍采用了C语言,例如单片机软件系统开发、三维图编写、动画编写等。

1.3 混合编程的意义

在进行程序设计时,C语言可以高效地生成目标代码,但是汇编语言生成的目标码质量更高,而且利用汇编语言完成对计算机硬件的特殊操作更快捷准确。利用汇编语言编程时,数据运算较繁琐,但C语言具有强大的库函数,可以高速完成对数据的处理。所以合理地混合使用两种语言进行程序设计,可以有效提高工作效率和工作质量。在混合编程时,C语言的主程序和汇编语言的主程序允许互相调用其子程序,也将汇编子程序插进C语言程序中,同时如何进行参数传递及确定调用关系非常重要,也要考虑到不同功能模块之间的连接问题。运用混合编程技术既可以发挥汇编语言的精确性优势及充分运用计算机硬件的功能,又可以利用C语言强大的数据处理能力,可以有效解决在大型程序设计中遇到的问题[1]。

2 混合编程的注意事项

2.1 注意保护堆栈和寄存器,以完成参数传递

汇编语言程序利用寄存器来完成参数信息的传递,C语言程序利用堆栈传递参数数据给汇编语言程序。C语言程序在调用汇编语言的变量和过程时,按下述的过程输送数据:C语言调用程序将参数按顺序压入堆栈→汇编语言用BP寄存器加上对应的偏移量来存取堆栈中C语言程序传递过来的参数→汇编语言进行程序转换→C语言从堆栈按顺序弹出的参数中获得操作数据。

所以在编程之前,应充分熟悉并掌握所用编程语言的多类别的堆栈的结构、生成和入栈模式。对汇编语言而言,应根据变量和过程的参数个数来选择合适的寄存器。当参数小于或等于4个时,将参数数据按次序一一传送到R0、R1、R2和R3寄存器;当子程序的参数个数大于4个时,将多出的参数数据按照原次序的反方向分别传送到数据栈[2]。

在C语言程序调入使用汇编变量和过程时要注意保护各种重要的寄存器,如DS、BP、SI、DI、AX和DX等,根据需要将数据用PUSH指令压入堆栈来保护,以保证参数的顺畅传递,否则会导致出现失误。

2.2 注意汇编子程序的返回值

返回值通过AX和DX寄存器来传递。少于16位二进制的返回值存放于AX,而32位的返回值中的低16位仍存放于AX,而其余的高16位则存放于DX寄存器中。大于32位(如浮点)的返回值存放于静态变量存储区[3]。

2.3 应统一两种语言的存储模式

汇编语言是使用Model来生成符合用户已选存储模式的段定义。而C语言则有6种存储模式可供选择,所选择的存储模式不同,其定义的代码段就不同。在混合编程时,汇编语言和C语言最好选择统一的存储模式,例如汇编语言选用Model Small模式来适应C语言的Small模式,以确保不同功能模块的准确衔接。

2.4 变量和函数的互相调用时命名方式的约定

在运用C语言进行程序设计的过程中,如需要使用汇编语言程序的过程和变量,汇编语言应加public标识,并在过程和变量名前加下划线,比如public_fun。

而汇编程序在调用C语言程序的函数或者变量时,应在调用部分的代码前添加下划线,并在汇编语言程序的命名时用extern加以说明,其格式分别是:extern_变量名:变量类型或者extern_函数名:函数类型[4]。

3 汇编语言和C语言混合编程方法

在完成功能复杂的软件的设计时,需首先将软件划分成不同的功能模块,每个功能模块以子程序或函数的形式存在,针对每个功能模块的不同特征,合理选用恰当的计算机语言来单独编程,而后将每个模块编译为相应的目标文件,所有文件组合后形成所需命令。

3.1 C语言程序直接插入单独汇编指令

C语言程序可执行汇编语言的ASM指令,故可运用ASM在C语言程序中嵌入所需汇编指令,不同的情况下,嵌入格式不同。

单个语句插入格式为:

“asm汇编语言指令代码”

如语句多,格式应为:

格式要求:(1)必须在对应的汇编程序代码前加入ASM;(2)必须按照C语言的环境要求使用分隔符“;”与注释分界符“/*”和“*/”。

这种混合编程方法虽然简单易行,但是直接插入的模式一旦出现细微偏差,就会影响原来的C语言环境,出现差错。所以此方法适用于需要汇编语言程序为程序实现一些特殊的硬件功能,且汇编程序简短时采用。此方法不适用于嵌入较复杂的汇编程序[5]。

3.2 以C语言为主,插入汇编语言

在运用C语言编程时,如果出现需要用汇编语言编程来实现特定功能的情况,且对应的汇编语言程序较为复杂,需要大量的汇编语言才能实现软件所需功能,则不应选择直接嵌入的方式,而应考虑将这部分软件程序划分为独立的功能模块,用汇编语言独立编制程序代码后,整体插入C程序对应位置。

在C语言主程序调入使用汇编语言的子程序的过程中,必须保证汇编源代码的正确性,才能确保调入使用过程的正确,最终顺利实现软件所需功能。因此,汇编源程序要严格依照系统要求来编制。

二者对照如表1所示。

必须用public和下划线来标明汇编子程序的外部函数属性,也就是严格按照下述格式:public_变量类型(或者变量名称),以保证C语言顺利地调入使用汇编子程序。

3.3 以汇编语言为主,C语言为辅

汇编语言具有在输入程序时能够直接采取二进制数据、控制硬件操作等C语言不具备的编程特长,因此汇编语言允许以主程序的方式调入使用C语言的函数和过程。

在调入使用时,要注意如下事项:(1)在被调用C语言函数前要加上extern标识,以表明其外来性质,以免跟原程序的代码弄混;(2)注意在调用时,要按照反向顺序依次将C语言函数的参数压入对应的任务堆栈,也就是保证最后子程序的最末位参数首先压入堆栈;(3)同时,在汇编主程序中用“call near ptr函数名”的形式完成调入使用C函数,不再加入原针对堆栈的指令[6]。

操作示例:

C子程序:

其过程为:前4个参数保存在r1-r4中→后两个参数留在堆栈用b1指令调用C程序模块→r0中得出结果。

4 结语

对于一些特殊领域的特殊应用需求的软件而言,混合编程可以解决很多难题。整个编程过程中交互使用两种语言,完成数据模型的搭建和数据的共享,以按照软件的功能需求,最终成功地完成程序编制。

摘要:C语言虽是高级计算机语言,但汇编语言可以高效率、高质量地发挥计算机硬件操作系统的功能,在程序编写时将二者有机结合并加以利用,可以事半功倍。

关键词:汇编语言,C语言,嵌入,相互调用,程序调试,混合编程

参考文献

[1]史斌.ARM汇编语言和C/C++语言混合编程的方法[J].电子测量技术,2006,(6).

[2]陈百良.单片机C语言与汇编语言的混合编程[J].科技信息,2008,(6).

[3]牟淑杰.C语言与汇编语言的混合编程[J].电大理工,2004,(1).

[4]杨加国.单片机C语言与汇编语言的混合编程[J].成都大学学报(自然科学版),2008,(3).

[5]左艳丽.C语言和汇编语言混合编程的方法和实现[J].职教与经济研究,2008,(3).

c语言编程习题和答案 篇3

关键词:存储空间图;间接寻址;一级指针;二级指针;存储单元

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-31093-03

A Discussion about the Relation of C Language Pointer and Assemble Language Indirect Addressing——Giving Analysis from the Storage Space Digraph

WANG Hai-yan

(Computer Science Department of Suqian College, Suqian 223800, China)

Abstract: C language is a user-oriented procedural language. Pointer is the most flexible part in this language. Assemble language is a language which is processor-oriented and there is no definite conception of pointer, but the similar conception of pointer emergences everywhere. In this paper, it present the application of pointer in assemble language through indirect addressing mode. Depending on the storage space digraph and the relation between pointer of C language and indirect addressing of assemble language, it makes it easier to understand the application and relation between the two languages.

Keywords: Storage Space Digraph; Indirect Addressing; Pointer; Second Rank Pointer; Storage Unit

1 引言

作为最基本的编程语言之一,汇编语言的重要性勿庸置疑,即使是 Linux 程序员有时也需要使用汇编语言解决实际问题,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。我们常说汇编语言的抽象是C语言, 而C语言中最灵活是C语言中拥有“指针”这个数据类型。那么汇编语言和C语言中的指针有什么样的关系呢?我们也知道在汇编语言中,几乎所有对内存的操作都是对给定地址的内存进行访问来完成的,那么在汇编语言中,绝大多数操作也必然和地址(即指针)产生或多或少的联系。汇编语言和CPU以及内存,端口等硬件知识是连在一起的。汇编语言中存储数据的地方不仅有寄存器而且还有存储单元,更多的数据则保存在存储单元中。因此,对编程人员而言,他肯定迫切地希望访问内存,以保存

更多的数据,本文将重点阐述访问数据的方式。

2 存储空间图的概念

画一个图形,或者观察一个图形,能帮助我们把复杂的程序设计具体化、形象化,有利于掌握程序之间的内在联系,从而更好的理解程序,激发大家对程序设计语言的兴趣。本文用形象的图形解释C语言中指针以及汇编语言中间接寻址方式之间的相互关系。文中运用类似于存储空间图的方法对两门语言进行解释。说它类似于存储空间图是因为这种图形没有用真正二进制描述空间的值和空间的地址,姑且我把这种图形叫做存储空间图。

3 两门语言之间的内在联系

我们知道在计算机中,所有的数据都是存放在存储器中的,访问数据的方式并不是唯一的。在C语言中访问单元数据有两种常见方式,一是通过名字直接访问单元数据;二是通过指针访问单元数据。直接通过单元名字访问数据,两种语言都很简单,我在这篇文章中不加以阐述。接下来我就分一级指针和二级指针分别阐述汇编语言和C语言是如何间接访问内存单元数据,又是以怎样的形式加以表现的。

3.1 C语言中的一级指针和汇编语言中一次间接寻址的联系

3.1.1 C语言中一级指针定义

指针定义形如:数据类型 *指针变量,它的存储空间图表示如下:

图1中X就是一级指针,Y是一个整形变量,X、Y的本质区别在于X单元的值是用于存放内存单元的地址,Y单元是存放任意类型的数据。X之所以指向Y,是因为Y单元的地址赋予了X,同时X所指向的类型和Y同类型。

图1

3.1.2 汇编语言中的一次间接寻址是指通过寄存器或存储单元一次间接寻找操作数。

它的存储空间图表示如下:

图2中si是cpu中的一个寄存器,si中存放着Y所在单元的地址,Y是一个单元的名称,Y单元存放着普通操作数,si之所以指向Y,是因为Y单元的地址赋予了si。

图2

图1、图2中X和si都是用于存放内存单元的地址,我们从中可以得到启迪,汇编语言中也存在着类似C语言的指针。

3.1.3 以下从编程角度深入探悉二者之间的联系。

例1 用C语言指针的方法输出a单元中的数据:

main()

{int a=3,*p;

p=&a

printf("%d",*p); 3

}

例2 用间接寻址方法把a单元中的数据送往al寄存器中:

data segment

a db 3

data ends

……

lea si, a

mov al, [si]

……

以上程序均是操作存储单元中的数据,但都不是通过单元名字操作的。例1用C语言中一级指针的方法,例2用汇编语言中的寄存器间接寻址的方法。那么二者有怎样的联系呢?为了讲清楚这个问题,我把这两个程序分别用以下存储空间图表示:

图3 C语言编程的存储空间图图4 汇编语言编程的存储空间图

上图中p和si其实质都是一级指针,在C语言中是用指针指向的内容,即用*p的形式来取得单元的数据,而汇编语言是通过寄存器一次间接寻址方式来取得单元内容,当然这都要求指针p和寄存器si首先获得单元的地址。(p=&a/lea si, a)。

3.2 C语言中的二级指针和汇编语言中二次间接寻址的联系

3.2.1 C语言中二级指针的定义。

指针定义形如:数据类型 **指针变量,它的存储空间图表示如下:

图5中X相对与Z这个变量是二级指针,它和一级指针的区别在于X这个指针所指向的内容仍然是某个单元的地址(图中是Z单元的地址)。要想输出Z单元的内容,则需要通过两次指向才能完成。

图5

3.2.2 汇编语言中二次间接寻址是指通过寄存器或存储单元两次间接寻找操作数。

它的存储空间图表示如下:

图6中si其实就等价于图5中定义的X,都是二级指针。但在汇编语言中si是一个指针寄存器,无论是作为一级指针还是作为二级指针,我们在使用的时候都是不需要定义的。事实上汇编语言中根本没有一级指针和二级指针的定义,也就是说汇编语言中没有C语言中定义上的繁琐,但你仍可以用C语言的思想来解释汇编语言中的指针问题。

图6

3.2.3 以下从编程角度深入探悉二者之间的联系。

例3 输出以下字符串

main()

{char *p[] = {"ab", "cd", "ef"};

char **sp = p;

int i;

for(i=0; i<3; i++)

printf("%s", **(sp+i));

}

图7 C语言编程的存储空间图

例4 累加数组array中元素和的程序段

data segment

array dw 10,20,30,40,50,60,70,80,90,100

count dw 10

sum dw?

table dw 3 dup(?);地址表

data ends

code segment

main proc far

assume cs:code, ds:data

start:push ds

……

mov table, offset ary

mov table+2, offset count

mov table+4, offset sum

mov bx, offset table

call proadd

ret

main endp

proadd procnear

……

mov si, [bx]

mov di, [bx+2]

mov cx, [di]

mov di, [bx+4]

xor ax, ax

next: add ax, [si]

add si, 2

loop next

mov [di], ax

……

proadd endp

code ends

end start

图8 汇编语言编程的存储空间图

以上程序均是通过两次操作才找出单元中的数据,前者是用C语言中二级指针二次指向的方法,后者是用汇编语言中的两次间接寻址的方法寻找操作数。从上图可知这两门语言的内在联系,即两门语言最终都是通过指针两次寻址来访问操作数。所不同的是:前者是二级指针的概念,后者是两次间接寻址。这种本质相同,只是语言描述上有所不同的概念,从存储空间图的视角可以帮助我们更好的理解他们之间的联系。

依此类推,对于多级指针的学习,我们也可以借助存储空间图来帮助我们更好的分析程序,理解程序,对于一些复杂的问题给予简化,对于不同语言之间的关系我们也能进行更好的深入思考。

4 结束语

本文通过存储空间图深入浅出的探悉了两门语言在寻找数据方面的联系。可以说C语言的指针和汇编语言的寻址方式一直困扰着很多编程者,尤其对二级指针、二次间接寻址的理解及运用更加困难。文中的例题均以最简单的题型来说明这些深奥的道理,而且从存储空间图的视角分析了二者之间的联系。相信这篇文章,不仅能帮助我们运用存储空间图解释问题、分析问题,而且能帮助我们更好的思考不同语言之间的联系,更好的去思考程序设计。

参考文献:

[1] 裘宗燕. C++程序设计语言(特别版). 北京机械工业出版社, 2002.7.

[2] Standley B.lippman. C++ Primer中文版. 人民邮电出版社,20006.3.

[3] 谭浩强. C程序设计(第二版). 清华大学出版社出版,2005.6.

[4] 钱能. C++程序设计教程. 清华大学出版社, 2005.5.

[5] 沈美明. IBM PC汇编语言程序设计. 清华大学出版社,1993.9.

[6] 钱晓捷. 汇编语言程序设计. 电子工业出版社,2003.

c语言编程习题和答案 篇4

本节训练点:撰写对联

1.阅读下面的文字,完成(1)~(2)题。

“千门万户曈曈日,总把新桃换旧符。”贴春联是中国人过年时的一项传统民俗活动。人们通常在除夕这天,将写好的春联贴于门上,春联的字数可多可少,但上下联必须构成对仗,如四言联“春安夏泰,秋稔冬祥”。六言联“冬尽梅花点点,________”。春联寓意吉祥,言简意赅,深受人们喜爱。

春联是仅在春节这一特定时节张贴的对联,而对联还有其他种类,如婚联、寿联、挽联,以及为园林建筑题写的楹联等。对联的撰写,往往注重其内涵与品味。尤其是名联佳对,文辞讲究、意蕴丰富,吟咏起来朗朗上口,齿颊留香。对联或镌刻或书写,楷行隶篆,其中不乏艺术精品。

(1)在文中横线处填入下列语句,恰当的一项是()A.万户杨柳依依

C.春回爆竹声声

B.千家喜气洋洋 D.春来微风缕缕

(2)下列关于“对联”的表述,正确的一项是()A.字数限于四言和六言 B.上下联讲究对仗和押韵 C.只适合在喜庆场合张贴 D.常常与书法艺术相结合

2.(江苏高考)下列诗句与“墙头雨细垂纤草”对仗工整的一项是()A.水面风回聚落花 C.楼上春容带雨来

B.数峰无语立斜阳 D.蝉曳残声过别枝

3.为弘扬中华传统文化,春蕾文学社决定举办一次宣传中华民族传统节日的活动。为营造氛围,彰显主题,请你从清明、端午和中秋三个节日中任选一个,为它们撰写一副对联,要求突出特征,主题鲜明。

上联:____________________________________________________________________ 下联:____________________________________________________________________ 4.下面是一副对联的上联,请根据对联的特点,写出下联。上联:上知天文,下晓地理,中通孔孟儒家道

下联:____________________________________________________________________ 5.阅读下面四首杜牧的诗,把下面四句诗分别填入到上面四首原诗中去。《赠别(其一)》:娉娉袅袅十三余,豆蔻梢头二月初。①________

《遣怀》:落魄江湖载酒行,楚腰纤细掌中轻。②________

《寄扬州韩绰判官》:青山隐隐水迢迢,秋尽江南草未凋。③________

《叹花》:自恨寻芳到已迟,往年曾见未开时。

④________

A.二十四桥明月夜,玉人何处教吹箫。B.十年一觉扬州梦,赢得青楼薄幸名。C.春风十里扬州路,卷上珠帘总不如。D.如今风摆花狼藉,绿叶成阴子满枝。

6.将下面的短语组成两副七字对联,并填写在相应的横线上。芝兰绕阶 黄牛耕地 翠柳迎春 桃李满园 千里绿

春绣锦

座凝香

万山金

上联

新春对联下联

上联

教师办公室对联下联

7.有人读完《水浒传》和《西游记》后,写了一副对联,下面是下联,请你拟出上联。上联:____________________________ 下联:梁山好汉疾恶如仇杀富济贫得人心

8.对联是我国传统文化中的重要组成部分,“析字联”又是对联中的一朵奇葩,变化无穷,妙趣横生。

据说,有两家联姻,男方姓潘,女方姓何,在举行婚礼这天,有客人赠联祝贺:嫁得潘家郎,有水有田方有米;又对下联:娶得何家女,添人添口便添丁。上联以“水、田、米”合成“潘”字,下联以“人、口、丁”合成“何”字,既暗含双方的姓氏,又反映了双方的愿望,幽默诙谐之中增添了喜庆的气氛。

传说,康熙求才若渴,一旦发现,便不拘一格地重用。一天,康熙听说一位和尚很有学问,便请他来宫中下棋。康熙连输三盘,出上联试和尚:“山石岩下古木枯,此木为柴。”此联析“岩”“枯”“柴”三字而成,文字连贯。和尚随口而出:____________________。康熙一听,和尚也妙析了三字,对得无懈可击,心中十分高兴,便委以重任。

请你写出和尚对的下联:___________________________________________________。9.请用对偶句描述下面《红楼梦》中宝黛初会的情景,字数不超过30字。

黛玉一见,便吃一大惊,心下想道:“好生奇怪,倒像在那里见过一般,何等眼熟到如此!”……宝玉看罢,因笑道:“这个妹妹我曾见过的。”贾母笑道:“可又是胡说,你又何曾见过他?”宝玉笑道:“虽然未曾见过他,然我看着面善,心里就算是旧相识,今日只作远别重逢,亦未为不可。”

答:________________________________________________________________________ ________________________________________________________________________ 10.把下列对联补充完整。(1)朝霞映窗棂

________________________________________________________________________(2)开卷读美文

________________________________________________________________________

(3)月色与灯光辉映

________________________________________________________________________(4)晨曦中书声琅琅

________________________________________________________________________(5)七尺小屋,承载父母殷切希望

________________________________________________________________________ 11.请根据下列内容,拟写一副对联,再加一个四字横批。要求对联能从“形、色、香、味”四个方面概括龙井茶的特点,横批对龙井茶作总的评价。

龙井茶素以“形、色、香、味”俱佳而闻名于海内外。它的色泽并非翠绿,而是嫩绿中略透黄色;悠悠的香气沁人脾胃,有芝兰似的清香;外表扁平光滑,中间宽,两头稍尖,有人说像麻雀的舌头;细细品饮有淡淡的甜味,浓醇可口。

对联_____________________________________________________________________ 横批_____________________________________________________________________ 12.请运用相关知识,把下列短语组合成一副赞颂我国南宋一著名诗人的对联。

池馆重新接草堂 宦游西蜀 烟尘誓扫还金阙 志复中原 诗继少陵 派开南宋 更入清风明月 高吟铁马铜驼

对联:___________________________________________________________________ ________________________________________________________________________ 13.下面这副对联明显有对得不工整的地方,在不改动字句的前提下,请分别调整上下联词语顺序,使上下联对仗工整,合乎对联的要求。

纵目登阁鸢飞鱼跃千帆竞 览胜抒怀水木清华万类荣

修改为:_________________________________________________________________ ________________________________________________________________________

答案

1.(1)选C 本题考查对联及修辞的运用。对联要求上下联对仗,词性相同,字数相等。题目中和“冬”对应的是“春”,排除A和B,第一段写过年习俗,所以应该选C。

(2)选D 此题直接考查对联的相关知识。对联字数上不固定,不只限于四言和六言,故A项错;对联不必押韵,故B项错;对联不只适合在喜庆场合张贴,在丧葬等场合也可使用,故C项错。对联的书写是书法的一项重要内容,所以D项正确。

2.选A 本题以选择题的形式考查对偶。对偶,首先要注意词性相对。先分析题干诗句,“墙头”是名词,“头”是对“墙”的补充;“雨”是名词,“细”补充说明了“雨”的状态;“垂”是动词;“纤草”是名词,且“纤”是形容词,说明了“草”的状态。然后分析选项:A项,“水面”对“墙头”,“风回”对“雨细”,“聚”对“垂”,“落花”对“纤草”,意义相称,词性相同,对仗工整;B、C、D三

项中的“数峰无语”“雨来”“蝉曳残声”词性都与题干句不对仗。

3.(示例)清明节:春风重拂地 佳节倍思亲

端午节:拴五色线挂荷包吃粽子度端午 饮雄黄酒去百病赛龙舟过夏日 中秋节:三秋桂子十里荷 一轮明月两地心 4.(示例)纵观千里,横溢才华,独尊韩非法家术

5.解析:这四首都是绝句,都应该符合基本的押韵规则。选项A韵脚是“箫”,与之相配的是第三首诗《寄扬州韩绰判官》,韵脚字“凋”;选项B韵脚是“名”,与之相配的是第二首诗《遣怀》,韵脚字“轻”;选项C韵脚是“如”,与之相配的是第一首《赠别》,韵脚字“初”;选项D韵脚是“枝”,与之相配的是《叹花》,韵脚字“时”。

答案:①C,②B,③A,④D。

6.解析:对联讲究字数相等,意义相关或相反,结构相同,平仄相对。从结构上看:四字短语都是主谓结构,但“芝兰”“桃李”为并列式,“黄牛”“翠柳”为偏正式;三字短语中“千里/绿”“万山/金”结构一样,“春/绣锦”“座/凝香”结构一致。然后依据平仄确定上下联:上联最后一个字多为仄声,下联最后一个字则应为平声。

答案:新春对联:翠柳迎春千里绿 黄牛耕地万山金 教师办公室对联:桃李满园春绣锦 芝兰绕阶座凝香

7.(示例)西游师徒从善如流降妖除魔应天道 8.白水泉边女子好,少女更妙

9.解析:注意满足三点要求:①描述宝黛初会的情景;②用对偶句;③不超过30字。答案:(示例)娇黛玉一见惊疑似何处见过宝哥哥 痴宝玉初识欣喜如梦里重逢林妹妹

10.(示例)(1)晚灯伴书声;(2)抚琴奏妙音;(3)天籁共琴声奏鸣;(4)月光下琴音泠泠;(5)三更灯火,照亮学子锦绣前程。

11.(示例)形如雀舌色(呈)黄绿,香似芝兰味(觉)甘醇。四绝佳茗或驰誉海内。

12.宦游西蜀,志复中原,高吟铁马铜驼,烟尘誓扫还金阙;诗继少陵,派开南宋,更入清风明月,池馆重新接草堂。

c语言编程习题和答案 篇5

第1章 程序设计基本概念

1.1 程序和程序设计

1[单选题] 以下叙述中错误的是()。

A.C语言源程序经编译后生成后缀为.obj的目标程序

B.C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文件

C.用c语言编写的程序称为源程序,它以ASCIl代码形式存放在一个文本文件中

D.C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令

参考答案:D

参考解析:并不是源程序中的所有行都参加编译。在条件编译形式下,相关内容只在满足一定条件时才进行编译。选项D)中的非执行语句不在其范围内。

2[单选题] 下列描述中正确的是()。

A.算法是指对解题方案的准确而完整的描述

B.算法的有穷性是指算法程序的长度是有限的

C.算法是否有效与拥有的情报无关

D.算法的基本特征有可行性、确定性和有穷性

参考答案:A

参考解析:算法是指对解题方案的准确而完整的描述。算法具有4个特征:可行性、确定性、有穷性和拥有足够的情报。有穷性指算法必需在有限时间内做完,即算法必需能在执行有限个步骤之后终止。当算法拥有足够的情报时,此算法才是有效的;而当提供的情报不够时,算法可能无效。

3[单选题] 下列数据结构中属于非线性结构的是()。

A.队列

B.线性表

C.二叉树

D.栈

参考答案:C

参考解析:线性结构满足两个条件:有且只有一个根结点;每个结点最多只有一个前件,也最多只有一个后件。栈、队列、线性表都属于线性结构,二叉树是一种非线性结构,因为除叶子结点外,每个结点都有两个后件,不满足线性结构的条件。

4[单选题] 4个元素A、B、C、D依次入栈,入栈过程中允许栈顶元素出栈,假设某一时刻栈的状态是C(栈顶)、B、A(栈底),则不可能的出栈顺序是()。

A.D、C、B、A

B.C、B、D、A

C.C、A、D、B

D.C、D、B、A

参考答案:C

参考解析:栈的特点是先进后出,所以后入栈的最先出栈。在栈的状态是c(栈顶)、B、A(栈底)时,D未入栈,栈顶元素可以出栈,但A不可能比B先出栈,所以c选项错误。

5[单选题] 下面概念中,不属于面向对象方法的是()。

A.对象

B.继承

C.类

D.过程调用

参考答案:D

参考解析:类是指具有共同属性、共同方法的对象的集合,所以类是对象的抽象,对象是对应类的一个实例。继承是指能够直接获得已有的性质和特征,而不必重复定义它们。所以选项A、B、C属于面向对象方法,选项D属于面向过程方法。

6[单选题] 下列选项中属于软件生命周期开发阶段任务的是()。

A.可行性研究

B.需求分析

C.详细设计

D.软件维护

参考答案:C

参考解析:软件生命周期可分为软件定义、软件开发和软件运行维护3个阶段。软件开发期包括概要设计、详细设计、实现和测试4个阶段。

7[单选题] 软件设计中衡量模块独立性的度量标准是()。

A.抽象和信息隐蔽

B.局部化和封装化

C.内聚性和耦合性

D.激活机制和控制方法

参考答案:C

参考解析:耦合性与内聚性是模块独立性的两个定性标准,耦合与内聚是相互关联的。在程序结构中,各模块的内聚性越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。

8[单选题] 下列不属于过程设计工具中图形工具的是()。

A.N—S

B.PAD

C.程序流程图

D.DFD

参考答案:D

参考解析:常用的过程设计工具有图形工具(程序流程图、N-S图、PAD图、HIPO)、表格工具(判定表)、语言工具(PDL)。

9[单选题] 下列叙述中错误的是()。

A.数据库管理系统是数据库的核心

B.数据库系统由数据库、数据库管理系统、数据库管理员三部分组成

C.数据共享最好的是数据库系统阶段

D.数据库中的数据独立于应用程序而不依赖于应用程序

参考答案:B

参考解析:数据库管理系统是数据库系统的核心,它位于用户和操作系统之间,属于系统软件。数据库系统由数据库、数据库管理系统、数据库管理员、硬件平台和软件平台五部分组成。数据库技术的发展经历了3个阶段,人工管理、文件系统和数据库系统,数据共享最好的是数据库系统阶段,数据库中的数据独立于应用程序而不依赖于应用程序。

10[单选题] 在下列选项中,哪个不是一个算法一般应该具有的基本特征()。

A.无穷性

B.可行性

C.确定性

D.有穷性

参考答案:A

参考解析:作为一个算法,一般应具有以下几个基本特征:可行性、确定性、有穷性、拥有足够的情报。本题答案为A)。

11[单选题] 下列关于栈的叙述中正确的是()。

A.在栈中只能插入数据,不能删除数据

B.在栈中只能删除数据,不能插入数据

C.栈是先进后出(FILO)的线性表

D.栈是先进先出(FIFO)的线性表

参考答案:C

参考解析:栈是限定在一端进行插入与删除的线性表。栈是按照“先进后出”的或后进先出的原则组织数据的,因此,栈也被称为“先进后出”表或“后进先出”表。本题答案是C)。

计算机二级c语言试题及答案 篇6

1.(A)是构成C语言程序的基本单位。

A、函数

B、过程

C、子程序

D、子例程

2.C语言程序从 C 开始执行。

A、程序中第一条可执行语句

B、程序中第一个函数

C、程序中的main函数

D、包含文件中的第一个函数

3、以下说法中正确的是(C)。

A、C语言程序总是从第一个定义的函数开始执行

B、在C语言程序中,要调用的函数必须在main()函数中定义

C、C语言程序总是从main()函数开始执行

D、C语言程序中的main()函数必须放在程序的开始部分

4.下列关于C语言的说法错误的是(B)。

A、C程序的工作过程是编辑、编译、连接、运行

B、C语言不区分大小写。

C、C程序的三种基本结构是顺序、选择、循环

D、C程序从main函数开始执行

5.下列正确的标识符是(C)。

A、-a

1B、a[i]

C、a2_i

D、int t

5~8题为相同类型题

考点:标识符的命名规则

只能由字母、数字、下划线构成数字不能作为标识符的开头

关键字不能作为标识符

选项A中的“-”,选项B中“[”与“]”不满足(1);选项D中的int为关键字,不满足(3)

6.下列C语言用户标识符中合法的是(B)。

A、3ax

B、x

C、case

D、-e2 E)union

选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D中的“-”不满足(1);

7.下列四组选项中,正确的C语言标识符是(C)。

A、%x

B、a+b

C、a12

3D、12

3选项A中的“%”,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2)

8、下列四组字符串中都可以用作C语言程序中的标识符的是(A)。

A、print _3d db8 aBc

B、Iam one_half start$it 3pai

C、str_1 Cpp pow while

D、Pxq My->book line# His.age

选项B中的“”,”$”,选项D中“>”,”#”,”.”,”-”不满足(1);选项C中的while为关键字,不满足(3)

9.C语言中的简单数据类型包括(D)。

A、整型、实型、逻辑型

B、整型、实型、逻辑型、字符型

C、整型、字符型、逻辑型

D、整型、实型、字符型

10.在C语言程序中,表达式5%2的结果是 C。

A、2.5B、2C、1D、3%为求余运算符,该运算符只能对整型数据进行运算。且符号与被模数相同。5%2=1;5%(-2)=1;(-5)%2=-1;(-5)%(-2)=-1;

/为求商运算符,该运算符能够对整型、字符、浮点等类型的数据进行运算,5/2=

211.如果int a=3,b=4;则条件表达式"aA、3B、4C、0

D、1详见教材P97.表达式1?表达式2:表达式

3先计算表达式1,若表达式1成立,则选择计算表达式2,并表达式2的值作为整个大表达式的值;

若表达式1不成立,则选择计算表达式3,并将表达式3的值作为整个大表达式的值

此题中的aa为3,b为4。a12.若int x=2,y=3,z=4 则表达式x

A、4B、3C、2D、0

E)

113.C语言中,关系表达式和逻辑表达式的值是(B)。

A、0

B、0或

1C、1D、‘T’或’F’

14.下面(D)表达式的值为4.A、11/

3B、11.0/

3C、(float)11/

3D、(int)(11.0/3+0.5)

14~16题为同一类型

详见教材P54~56.(1)相同数据类型的元素进行数学运算(+、-、*、/)得到结果还保持原数据类型。

(2)不同数据类型的元素进行数学运算,先要统一数据类型,统一的标准是低精度类型转换为高精度的数据类型。

选项A,11与3为两个整数,11/3结果的数据类型也应为整数,因此将3.666666的小数部分全部舍掉,仅保留整数,因此11/3=3.选项B,11.0为实数,3为整数,因此首先要统一数据类型,将整型数据3转换为3.0,转换后数据类型统一为实型数据,选项B变为11.0/3.0,结果的数据类型也应为实型数据,因此选项B 11.0/3=3.666666

选项C,先将整数11强制类型转换,转换为实型11.0,因此选项C变为11.0/3,其后计算过程、结果与选项B同

选项D,首先计算11.0/3,其计算过程、结果与选项B同,得到3.666666;再计算3.666666+0.5=4.166666,最后将4.166666强制类型转换为整型,即将其小数部分全部舍掉,结果为

415.设整型变量 a=2,则执行下列语句后,浮点型变量b的值不为0.5的是(B)

A、b=1.0/a

B、b=(float)(1/A、C、b=1/(float)a

D、b=1/(a*1.0)

16.若“int n;float f=13.8;”,则执行“n=(int)f%3”后,n的值是(A)

A、1B、4C、4.33333

3D、4.6

“(int)f“表示将f中的值强制类型转换为整型,即将13.8的小数部分舍掉,转换为13;然后计算13%3,结果为1,再将结果赋给变量n,因此n的值为

117.以下对一维数组a的正确说明是: D

A、char a(10);

B、int a[];

C、int k=5,a[k];

D、char a[3]={‘a’,’b’,’c’};

详见教材P143~144,一维数组的定义、初始化

类型符 数组名 [常量表达式]

类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;常量表达式是指数组的长度(数组中包含元素的个数),其值只能是整数,不可以是变量,而且从1开始计数。

选项A,常量表达式只能放在中括号 [ ]中

选项B,只有在对数组初始化(即赋值)的时候才可以省略数组的长度,B中并未对a进行初始化。

选项C,常量表达式不能为变量。

18.以下能对一维数组a进行初始化的语句是:(C)

A、int a[5]=(0,1,2,3,4,)

B、inta(5)={}

C、int a[3]={0,1,2}

D、int a{5}={10*1}

详见教材P145,一维数组的定义、初始化

选项B,D,常量表达式只能放在中括号 [ ]中

选项A,数组可以看做是若干个相同数据类型元素的有序集合,因此以集合的形式对其初始化,使用{ }对其初始化,选项A用了().19.在C语言中对一维整型数组的正确定义为 D。

A、int a(10);

B、int n=10,a[n];

C、int n;a[n];

D、#define N 10

int a[N];

20、已知:int a[10];则对a数组元素的正确引用是(D)。

A、a[10]

B、a[3.5]

C、a(5)

D、a[0]

详见教材P144,数组元素的引用

数组名[下标]

引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数

int a[10]表示定义了一个包含10个整型数据的数组a,数组元素的逻辑地址下标范围为0~9,即a[0] 表示组中第1个元素;a[1] 表示组中第2个元素;a[2] 表示组中第3个元素;......;a[9] 表示组中第10个元素.选项A,超过了数组a的逻辑地址下标范围;

选项B,逻辑地址下标只能为整数

选项C,逻辑地址下标只能放在[ ]中

21.若有以下数组说明,则i=10;a[a[i]]元素数值是(C)。

int a[12]={1,4,7,10,2,5,8,11,3,6,9,12};

A、10

B、9

C、6

D、5先算a[a[i]]内层的a[i],由于i=10,因此a[i]即a[10].a[10]对应下面数组中的元素为9.因此a[a[i]]即为a[9]

a[9]对应下面数组中的元素为6.因此a[9]即为6

22.若有说明:int a[][3]={{1,2,3},{4,5},{6,7}};则数组a的第一维的大小为:(B)

A、2B、3C、4D、无确定值7

D、3 6 9

二维数组的一维大小,即指二维数组的行数,在本题中,按行对二维数组赋值,因此内层有几个大括号,数组就有几行

23.对二维数组的正确定义是(C)

详见教材P149~152,二维数组的定义、初始化

类型符 数组名 [常量表达式][常量表达式]

二维数组可以看做是矩阵

类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;第一个常量表达式是指数组的行数;第二个常量表达式是指数组的列数;常量表达式的值只能是整数,不可以是变量,而且从1开始计数。

一维数组初始化时可以省略数组长度

二维数组初始化时可以省略行数,但不能省略列数

选项A,B,都省略了列数

选项D,不符合二维数组定义的一般形式,行、列常量表达式应该放在不同的[]中

A、int a[ ][ ]={1,2,3,4,5,6};

B、int a[2] []={1,2,3,4,5,6};

C、int a[ ] [3]={1,2,3,4,5,6};

D、int a[2,3]={1,2,3,4,5,6};

24.已知int a[3][4];则对数组元素引用正确的是__C___

A、a[2][4]

B、a[1,3]

C、a[2][0]

D、a(2)(1)

详见教材P150,数组元素的引用

数组名[下标] [下标]

引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数

第一个[下标]表示行逻辑地址下标,第二个[下标]表示列逻辑地址下标。

本题图示详见P149图6.7

因此a的行逻辑地址范围0~2;a的列逻辑地址范围0~3;

选项A,列逻辑地址下标超过范围

选项B,D,的引用形式不正确。

25.C语言中函数返回值的类型是由 A 决定的.A、函数定义时指定的类型

B、return语句中的表达式类型

C、调用该函数时的实参的数据类型

D、形参的数据类型

26.在C语言中,函数的数据类型是指(A)

A、函数返回值的数据类型

B、函数形参的数据类型

C、调用该函数时的实参的数据类型

D、任意指定的数据类型

27.在函数调用时,以下说法正确的是(B)

A、函数调用后必须带回返回值

B、实际参数和形式参数可以同名

C、函数间的数据传递不可以使用全局变量

D、主调函数和被调函数总是在同一个文件里

28.在C语言中,表示静态存储类别的关键字是:(C)

A、auto

B、register

C、static

D、extern

29.未指定存储类别的变量,其隐含的存储类别为(A)。

A、auto

B、static

C、extern

D、register

30.若有以下说明语句:

struct student

{ int num;

char name[ ];

float score;

}stu;

则下面的叙述不正确的是:(D)

A、struct是结构体类型的关键字

B、struct student 是用户定义的结构体类型

C、num, score都是结构体成员名

D、stu是用户定义的结构体类型名

31.若有以下说明语句:

struct date

{ int year;

int month;

int day;

}brithday;

则下面的叙述不正确的是__C___.A、struct是声明结构体类型时用的关键字

B、struct date 是用户定义的结构体类型名

C、brithday是用户定义的结构体类型名

D、year,day 都是结构体成员名

32.以下对结构变量stul中成员age的非法引用是 B

struct student

{ int age;

int num;

}stu1,*p;

p=&stu1;

A、stu1.age

B、student.age

C、p->age

D、(*p).age

33.设有如下定义:

struck sk

{ int a;

float b;

}data;

int *p;

若要使P指向data中的a域,正确的赋值语句是 C

A、p=&a;

B、p=datA、a;

C、p=&datA、a;

D、*p=datA、a;

34.设有以下说明语句:

typedef struct stu

{ int a;

float b;

} stutype;

则下面叙述中错误的是(D)。

A、struct是结构类型的关键字

B、struct stu是用户定义的结构类型

C、a和b都是结构成员名

D、stutype是用户定义的结构体变量名

35.语句int *p;说明了 C。

A、p是指向一维数组的指针

B、p是指向函数的指针,该函数返回一int型数据

C、p是指向int型数据的指针 // 指针的定义教材P22

3D、p是函数名,该函数返回一指向int型数据的指针

36.下列不正确的定义是(A)。

A、int *p=&i,i;

B、int *p,i;

C.int i,*p=&i;

D、int i,*p;

选项A先定义一个整型指针变量p,然后将变量i的地址赋给p。然而此时还未定义变量i因此编译器无法获得变量i的地址。(A与C对比,选项C先定义变量i,则在内存中为i分配空间,因此i在内存空间的地址就可以确定了;然后再定义p,此时可以为p赋i的地址,C正确)

37.若有说明:int n=2,*p=&n,*q=p,则以下非法的赋值语句是:(D)

A、p=q

B、*p=*q

C、n=*q

D、p=n

p,q同为整型指针变量,二者里面仅能存放整型变量的地址。

选项A,q中为地址,因此可将此地址赋给p

选项B,*p表示p所指向对象n的内容,即一个整数;*q表示q所指向对象的内容,由于在定义q时为其初始化,将p中n的地址给q,因此p中存放n的地址,*q表示q所指向对象n的内容.因此*p=*q 相当于 n=n;

选项C,n=*q 等价于n=n;

选项D,p中只能存放地址,不能将n中的整数值赋给p

38.有语句:int a[10],;则 B 是对指针变量p的正确定义和初始化。

A、int p=*a;

B、int *p=a;

C、int p=&a;

D、int *p=&a;

选项A,a是数组名,不是指针变量名,因此不可用*标注数组名a

选项C,a是数组名,数组名就是地址,无需再用地址符号。而且在定义指针变量p时,应在变量名前加*,标明p是指针变量

选项D,a是数组名,数组名就是地址,无需再用地址符号。

39.若有说明语句“int a[5],*p=a;”,则对数组元素的正确引用是(C)。

A、a[p]

B、p[a]

C、*(p+2)

D、p+

2首先定义一个整型数组a,a的长度为5,然后定义一个指针变量p,并同时对p进行初始化,将数组a的地址赋给p。因此此时p中存放的数组a的首地址,即数组中第一个元素a[0]的地址。

对于数组元素下标的引用(详见p144), 一般形式 数组名[下标] 其中下标为逻辑地址下标,从0开始计数,方括号中的下标可以是变量,可以是表达式,但结果一定要是整数。

选项A,p中存放的是地址,不是整数,不能做数组元素的下标

选项B,a是数组名,数组名就是地址,不是整数,不能做数组元素的下标

选项C,(重点!!详见p231~234)p+2表示指向同一数组中的下两个元素的地址,当前p指向a[0],则p+2表示a[2]的地址,因此*(p+2)表示a[2]的内容

40.有如下程序

int a[10]={1,2,3,4,5,6,7,8,9,10},*P=a;

则数值为9的表达式是 B

A、*P+9

B、*(P+8)

C、*P+=9

D、P+8

(重点!!详见p231~234)

首先定义一个整型数组a,a的长度为5,然后定义一个指针变量P,并同时对P进行初始化,将数组a的地址赋给P。因此此时P中存放的数组a的首地址,即数组中第一个元素a[0]的地址。

数组中9对应的是a[8], 选项B,P+8表示数组中后8个元素的地址,即a[8]的地址。*(P+8)则表示该地址内所存放的内容,即a[8]的值。

选项A,*P表示P所指向对象的内容,此时P指向a[0], *P即a[0]的值1.*P+9=1+9=10

C语言的指针运用和数组的关系 篇7

指针是C语言使用比较广泛的数据类型之一, 是C语言的一个重要特色。指针可以有效地表示复杂的数据结构、方便引用数据和字符串、动态分配内存、直接访问物理地址等等。正确而灵活地使用指针, 能够使程序精练, 高效运行。指针即是重点又是难点, 能否正确掌握和运用指针是是否掌握C语言的重要体现。有些学生在学习指针这部分时, 甚至学完C语言后仍然不明白指针是怎么回事, 为什么要用指针, 怎样用指针, 在什么情况下用指针, 复杂指针类型之间的区别和联系, 搞的不是很清楚。本文以指针和数组的关系为线索, 加以阐述。

2. 数组和指针的相关概念

数组是C语言的构造类型之一, 是同类数据的有序集合。数组元素可以是基本数据类型或是构造类型。C语言中规定, 数组只能静态定义, 定义时必须指定所占空间的大小。数组名表示数组在内存中的首地址。

指针这里是指指针变量。指针变量的值就是某个内存单元的地址。指针的实质就是通过对内存地址的操作来实现对数据的操作。

指针有指向简单变量的指针, 指向字符串的指针, 指向数组的指针即数组指针, 指向指针的指针等。本文将重点放到指针和数组的关系上。把上面的概念搞清楚, 在学习指向函数、结构体、文件等的指针就容易理解和掌握。

3. 数组与指针的关系

3.1 简单指针变量与数组的关系

例题1:输出一维整形数组a[4]的全部元素

方法一:用数组名访问数组元素

用下标法或者通过数组名计算数组元素地址, 找到数组元素。

for (i=0;i<4;i++) printf ("%3d", a[i]) ;或者for (i=0;i<4;i++) printf ("%3d", * (a+i) ) ;

方法二:用指针变量来访问数组元素

针对例题, 先定义一个指向整形变量的指针p并被赋初值p=a.。然后for (i=0;i<4;i++) printf ("%3d", *p++) ;

例题2:输出二维整形数组a[4][6]的全部元素

方法一:用数组名访问数组元素

方法二:用指针变量来访问数组元素

定义一个指向整形变量的指针p, 并被赋初值p=&a[0][0], 使用循环语句for (i=0;i<24;i++) printf ("%3d", *p++) ;来输出全部元素。

二维以上数组均可使用这两种方法。

分析:在对数组元素顺序访问时, 使用指针变量直接访问数组元素, 由于不用象使用数组名那样每次都要计算元素地址, 而是有规律地改变地址值, 大大提高了程序的执行效率。但在对数组元素进行随机访问时, 两者访问速度一样, 由于下标法更易理解, 不容易出错, 使用下标法更好。

3.2 数组指针、指针数组和指向指针的指针与二维数组的关系

例题1:对5个字符串进行排序

方法一:使用数组指针

在主函数中:

定义二维字符数组和指向由N个元素组成的一维数组的指针:char str[M][N];char (*p) [N];经输入语句输入各个字符串:for (i=0;i<M;i++) scanf ("%s", str[i]) ;再将指针p指向二维数组的首地址:p=str;执行调用语句:sort (p) ;最后输出结果:

在主函数中:

定义由M个指针类型元素组成的数组p:char*p[M];将各字符串的首地址赋给指针数组p的各元素:for (i=0;i<M;i++) p[i]=str[i];执行调用语句sort (p) ;通过循环语句for (i=0;i<M;i++) print ("%sn", p[i]) ;输出排序好的字符串。

方法三:使用指向指针的指针

在主函数中:

定义:char**p, *pstr[M], str[M][N];将第i个字符串的首地址赋给指针数组pstr的第i个元素:for (i=0;i<M;i++) pstr[i]=str[i];指针p指向指针数组pstr:p=pstr;执行调用语句:sort (p) ;通过循环语句:for (i=0;i<M;i++) printf ("%sn", pstr[i]) ;输出排序好的字符串。

分析:数组指针是指向含有多个元素组成的一维数组的指针变量, 即指向数组的指针, 而不是指向某个数组元素。因此可以理解为是一个行指针。使用数组指针时, 调用排序函数sort, 传递的参数是原字符数组的首地址。对原字符数组进行排序, 最后直接输出已经排序好的字符数组;

指针数组是其元素类型均为指针类型数据的数组。使用指针数组时, 由于数组的元素类型是指针型, 是各字符串的首地址, 调用sort函数后, 传递的参数是指针数组的首地址, sort函数是对指针数组排序, 原字符数组并无直接参与排序。通过输出已经排序好的指针数组来达到对原字符串的排序;

指向指针的指针是指指向指针数据的指针变量。使用指向指针的指针变量时, 又使用了一个指向指针数组的指针变量, 函数调用后传的参数也是指针数组的首地址, 但是sort函数是将存储各字符串地址的指针数组进行了排序, 通过使用指向指针的指针变量来对指针数组排序的。而不是象使用指针数组那样直接对指针数组排序。因此也必须通过输出指针数组的内容来达到排序的目的, 原字符串无变化。

3.3 数组指针、指针数组和指向指针的指针与数组的区别与联系

(1) 当数组的各维大小确定时, 多用静态数组, 但浪费严重, 适合对空间需求不大的场合;当数组的低维确定, 高维需要动态生成的场合, 例如a[x][16], 使用数组指针。体现指针里的一个进步, 指向整个数组而不是某个元素;当数组高维确定, 低维许动态生成时, 例如a[20][x], 使用指针数组。好处在于, 指针的内容可以根据需要动态生成, 避免浪费空间, 并且由于指针呈数组形式排列, 方便索引。当处理对象是多个字符串时, 使用指针数组可以节省空间, 提高程序的执行效率;当数组的高低维均需动态生成时, 使用指向指针的指针。

(2) 二维数组名、数组指针和指向指针的指针是同类型的, 同一级指针。但是二维数组名是指针常量, 而数组指针和指向指针的指针是指针变量。

(3) 数组在生命期内, 地址和容量保持不变, 内容可以变;使用数组初始空间大, 但索引方便。指针初始空间小, 动态分配空间, 使用灵活方便。常用指针来操作动态内存, 但如果使用不谨慎, 容易出错。

谈到指针的应用, 与数组有关的还有利用动态分配函数malloc () 或calloc () 为指针变量分配内存, 建立动态数组。

4. 结束语

指针是C语言的重要特色, 但指针及相关概念不容易理解, 使用也易出错。对于初学者来说, 只有勤于实践, 多上机调试程序, 才能真正掌握, 才能充分利用指针灵活多变的特点, 编写出有特色、高效和精练的程序。

参考文献

[1].谭浩强.C语言程序设计 (第三版) 北京:清华大学出版社, 2005、7

上一篇:参观饲料厂心得下一篇:平面设计大赛方案