搜档网
当前位置:搜档网 › 第十章 指针

第十章 指针

第十章 指针
第十章 指针

第十章指针

一、选择题

1.变量的指针,其含义是指该变量的_______________。

A) 值B) 地址C) 名D)一个标志

2.已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值是________________。

A)k=*ptr1+*ptr2 B) ptr2=k C) ptr1=ptr2D)k=*ptr1*(*ptr2)

3.若有定义int *p, m=5,n;以下程序段正确的是________________。

A) p=&n; B) p=&n;

scanf("%d",&p); scanf("%d",*p);

C) scanf("%d",&n); D) p=&n;

*p=n; *p=m;

4.若有定义:int *p1, *p2, m=5, n;以下____________是正确的赋值语句。

A) p1=&m; p2=&p1; B)*p1=*p2; C) p1=&m; p2=p1; D) p1=&m; *p2=*p1; 5.若有int *p, a=4;和p=&a;下面____________均代表地址。

A) a, p, *&a B)&*a, &a, *p C) *&p, *p, &a D)&a, &*p, p

6.若变量已正确定义并且指针p已经指向变量x,则*&x相当于____________。

A) x B) p C) &x D) &*p

7.若定义了int m, n=0, *p1=&m;则下列____________表达式与m=n等价。

A) m=*p1 B)*p1=&*n C) *&p1=&*n D) *p1=*&n;

8. 假如指针p已经指向整型变量x,则(*p)++相当于____________。

A) x++ B) p++ C) *(p++) D) &x++

9. 对于基类型相同的两个指针变量之间,不能进行的运算是____________。

A) < B) = C) + D) -

10. 若程序中已包含头文件stdio.h,以下选项中正确运用指针变量的程序段是__________。

A) int *i=NULL; B) float *f=NULL

scanf("%d",i); *f=10.5;

C) char t='m',*c=&t; D) long *L;

*c=&t; L='\0';

11. 有如下函数和变量定义int a=25; 执行语句print_value(&a);后的输出结果是___________。

void print_value(int *x)

{ printf("%d",++*x); }

A) 23 B) 24 C) 25 D) 26

12. 若有定义:char s[10]; 则在下面表达式中不表示s[1]的地址的是___________。

A) s+1 B) s++ C) &s[0]+1 D) &s[1]

13.若有定义:int a[5], *p=a; 则对a数组元素的正确引用是_____________。

A)*&a[5]B)a+2 C)*(p+5) D)*(a+2)

14. 若有定义:int a[5], *p=a; 则对a数组元素地址的正确引用是_____________。

A)p+5B)*a+1 C)&a+1 D)&a[0]

15. 若有定义:int a[5]; 则a数组中首元素的地址可以表示为_____________。

A)&a B)a+1 C)a D)&a[1]

16. 若要对a进行合法的自减运算,则之前应有下面___________的说明。

A) int p[3]; B) int k; C) char *a[3]; D) int b[10];

int *a=p; int *a=&k; int *a=b+1;

17. 以下选项中,________________对指针变量p的操作是正确的。

A) int a[3], *p; B) int a[5], *p;

p=&a; p=a;

C) int a[5]; D) int a[5], *p1, *p2=a;

int *p=a=100; *p2=*p1;

18若有定义int x[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p1;则数值不为3的表达式是___________。

A)x[3] B)p1=x+3,*p1++ c) p1=x+2,*(p1++) D) p1=x+2, *++p1

19. 设int x[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p=x, k; 且0≤k≤10,则对数组元素x[k]的错误引用是___________。

A)p+k B)*(x+k) c) x[p-x+k] D) *(&x[k])

20. 若有定义int a[3]={ 1, 2, 3}, *p;则下列赋值语句中正确的是___________。

A) p=&a; B) *p=a; C) *(a+1)=a; D) p=a+1;

21. 设int b[]={1, 2, 3, 4}, y, *p=b;执行语句y=*p++;后变量y的值为___________。

A) 1B) 2C) 3D) 4

22. 下面程序段执行后的输出结果是_____。

#include

void main()

{

int a[]={2, 4, 6, 8, 10}, y=0, x, *p=&a[1];

for(x=1; x<3; x++) y+=p[x];

pritnf("%d",y);

}

A) 10B) 11 C) 14 D) 15

23.若有定义int a[2][3];则对a数组的第i行第j列元素地址的正确引用是_____。

A) *(a[i]+j) B) (a+i) C) *(a+j) D) a[i]+j

24. 若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j均在有效范围内)地址的表达式是_____。

A) &a[0][0]+6*i+j B) &a[0][0]+4*j+i C) &a[0][0]+4*i+j D) &a[0][0]+6*j+i

25. 若有定义int a[3][4];则与元素a[0][0]不等价的表达式是_____。

A) *a B) **a C)*a[0] D) *(*(a+0)+0)

26. 若有定义int a=3, b, *p=&a; 则下列语句中___________使b不为3。

A) b=*&a; B) b=*p; C) b=a; D) b=*a;

27. 若有定义int t[3][2];则能正确表示t数组元素地址的表达式是_____。

A)&t[3][2]B)t[1][1] C)t[2] D)t[3]

28. 若有定义int a[4][5];下列_____引用是错误的。

A) *a B) *(*(a+2)+3) C) &a[2][3] D) ++a

29. 若有定义int s[4][5], (*ps)[5]=s;;则对s数组元素的正确引用是_____。

A) ps+1 B) *(ps+3) C) ps[0][2] D) *(ps+1)+3

30. 若有定义int c[4][5]; (*p)[5]=c;;则能正确引用c数组元素的是_____。

A) p+1 B) p[3] C) p[1]+3 D) *(p[0]+2)

31.下面程序执行后的输出结果是___________。

#include

void main()

{

int a[][4]={1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};

int (*p)[4], i=2, j=1;

p=a;

printf("%d",*(*(p+i)+j));

}

A) 9 B) 11 C) 17 D) 19

32.若有程序段int a[2][3], (*p)[3]; p=a;则对a数组元素地址的正确引用是___________。

A) *(p+2) B) p[2] C) p[1]+1 D) (p+1)+2

33. 若有程序段int a[2][3], (*p)[3]; p=a;则对a数组元素的正确引用是___________。

A) (p+1)[0] B) *(*(p+2)+1) C) *(p[i]+1) D) p[1]+2

34.下面程序执行后的输出结果是___________。

#include

void main()

{

int a[3][3], *p, i;

p=&a[0][0];

for(i=0; i<9; i++) p[i]=i+1;

printf("%d",a[1][2]);

}

A) 3 B) 6 C) 9 D) 随机值

35.若有定义int (*p)[4]; 则标识符p___________。

A) 是一个指向整型变量的指针B) 是一个指针数组名

C) 是一个指针,它指向一个含有四个整型元素的一维数组D) 定义不合法

36.以下正确的定义和赋值语句是___________。

A) int b[3][5], (*p)[5], (*q)[5]; p=b; q=b;

B) float b[3][5], (*p)[3]; p[0]=b[0]; p[2]=*b+4;

C) double b[3][5], s[5][3], *q; q=b; s=q;

D) int b[10], *q; char *s; q=b; s=b;

37.若要对a进行合理的自增运算,则a应具有_______________说明。

A) int a[3][2]; B) char *a[]={"12","ab"}; C) char (*a)[3]; D) int b[10], *a=b;

38.下面程序运行时从键盘上输入:1 2 3回车,其输出结果是___________。

#include

void main()

{

int a[3][2]={0}, (*ptr)[2], i, j;

for(i=0; i<2; i++) {ptr=a+i; scanf("%d",ptr); ptr++; }

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

for(j=0; j<2; j++) printf("%d",a[i][j]);

}

A) 编译错误信息B) 6102000 C) 123000 D) 102030

39.若有定义int x[4][3]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int (*p)[3]=x;则能够正确表示数组元素x[1][2]的表达式是_______________。

A) *((*p+1)[2]) B) (*p+1)+2 C) *(*(p+5)) D) *(*(p+1)+2)

40. 设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是_____________。

A) c=*p1+*p2; B) p2=c; C) p1=p2; D) c=*p1*(*p2);

41. 下面判断正确的是_____________。

A) char str[10]={"china"};等价于char str[10]; str[]={"china"};

B) char *a="china";等价于char *a; *a="china";

C) char *s="china";等价于char *s; s="china";

D) char c[4]="abc" ,d[4]="abc";等价于char c[4]=d[4]="abc";

42.下面能正确给字符串s赋值的是___________________。

A) char s[6]="ABCDE"; B) char s[5]={'A', 'B', 'C', 'D', 'E'};

C) char s[6]; s="ABCDE"; D) char *s; scanf("%s",s);

43.若有程序段char s[]="china"; char *p; p=s;以下叙述中正确的是___________________。

A) s和p完全相同B)数组s中的内容和指针变量p中的内容相等

C) *p与s[0]相等D) s数组长度和p所指向的字符串长度相等

44.以下不正确的是___________________。

A) char a[10]="china"; B) char a[10], *p=a; p="china";

C) char *a; a="china"; D) char a[10], *p=a; p=a="china";

45.若有定义char a[]="Itismine", *p="Itismine";以下叙述中错误的是___________________。

A) a+1表示的是字符't'的地址B)p不能再指向别的字符串常量

C) p变量中存放的地址值可以改变D) a数组所占字节数为9

46.若有定义char s[6], *ps=s;则正确的赋值语句是___________________。

A) s="12345"; B)*s="12345"; C) ps="12345"; D) *ps="12345";

47.若有定义char s[10], *p=s;下列语句中错误的是___________________。

A) p=s+5; B)s=p+s; C) s[2]=p[4]; D) *p=s[0];

48.若有定义char *cc[2]={"1234", "5678"};以下叙述中正确的是___________________。

A) cc数组的两个元素中各自存放了字符串"1234"和"5678"的首地址

B)cc数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址

C) cc是指针变量,它指向含有两个数组元素的一维字符数组

D) cc数组元素的值分别是"1234"和"5678"

49.若有定义char *language[]={"FORTRAN", "BASIC", "PASCAL", "JA V A", "C"};则language[2]的值是___________________。

A) 一个字符B)一个地址C) 一个字符串D) 一个不定值

50.若有定义char ch[]={"abc\0def"}, *p=ch;执行语句printf("%c",*p+4);后的输出结果是___________________。

A) def B) d C) e D) 0

51.下面程序段中,for循环的执行次数是________________。

char *s="\ta\018bc";

for(; *s!='\0'; s++) printf("*");

A) 9 B)7 C) 6 D) 50

52.下面程序段执行后的输出结果是___________。

char *s="abcde";

s+=2;

printf("%d",s);

A) cde B)字符'c' C) 字符'c'的地址D) 不确定

53.下面程序段执行后的输出结果是___________。

char a[]="language", *p;

p=a;

while(*p!='u') { printf("%c", *p-32); p++; }

A) LANGUAGE B)language C) LANG D) langUAGE

54.下面程序执行后的输出结果是___________。

#include

#include

void main()

{

char str[][20]={"Hello", "Beijing"}, *p=str;

printf("%d",strlen(p+20));

}

A) 0 B) 5 C) 7 D) 20

55.若有定义char a[10], *b=a;不能给数组a输入字符串的语句是_____________。

A) gets(a); B) gets(a[0]); C) gets(&a[0]); D) gets(b);

56.下面程序执行后的输出结果是___________。

#include

#include

void fun(char *s, int p, int k)

{

int i;

for(i=p; i

*(s+i)=s[i+2];

}

void main()

{

char s[]="abcdefg";

fun(s,3,strlen(s));

puts(s);

}

A) abcdefg B)abc C) defg D) abcfg

57.s1和s2已正确定义并分别指向两个字符串。若要求:当s1所指串大于s2所指串时,执行语句s;则以下选项中正确的是_______________。

A) if(a1>s2) s; B)if(strcmp(s1,s2)) s;

C) if(strcmp(s2,s1)>0) s; D) if(strcmp(s1,s2)>0) s;

58. .以下与库函数strcpy(char *p1, char *p2)功能不相等的程序段是_______________。

A) strcpy1(char *p1, char *p2)

{

while((*p1++=*p2++) !='\0');

}

B)strcpy2(char *p1, char *p2)

{

while((*p1=*p2!='\0') {p1++; p2++; }

}

C) strcpy3(char *p1, char *p2)

{

while((*p1++=*p2++);

}

D) strcpy4(char *p1, char *p2)

{

while(*p2) *p1++=*p2++;

}

59.若有定义char s1[]="string1", s2[8], *s3, *s4="string2"; 则对库函数strcpy错误调用的是____________。

A) strcpy(s1,"string2"); B) strcpy(s4,"string1");

C) strcpy(s3,"string1"); D) strcpy(s2,s1);

60. .以下与库函数strcmp(char *s, char *t)功能相等的程序段是_______________。

A) strcmp1(char *s, char *t)

{

for (; *s++==*t++; )

if(*s=='\0') return 0;

return (*s-*t);

}

B)strcmp2(char *s, char *t)

{

for (; *s++==*t++; )

if(!*s) return 0;

return (*s-*t);

}

C) strcmp3(char *s, char *t)

{

for (; *t==*s; )

{

if(!*t) return 0; t++; s++;

}

return (*s-*t);

}

D) strcmp1(char *s, char *t)

{

for (; *s==*t; s++,t++ )

if(!*s) return 0;

return (*s-*t);

}

61.下面程序执行后的输出结果是___________。

#include

#include

void main()

{

char b1[8]="abcdefg", b2[8], *pb=b1+3;

while (--pb>=b1) strcpy(b2, pb);

printf("%d", strlen(b2));

}

A) 8 B)7 C) 3 D) 1

62.下面程序执行后的输出结果是___________。

#include

void fun(int a[])

{

a[0]=a[-1]+a[1];

}

void main()

{

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

fun(&a[2]);

printf("%d",a[2]);

}

A) 6 B)7 C) 8 D) 9

63.下面程序执行后的输出结果是___________。

#include

int b=2;

int func(int *a)

{

b+=*a;

return (b);

}

void main()

{

int a=2, res=2;

res+=func(&a);

printf("%d",res);

}

A) 4 B) 6 C) 8 D) 10

64.函数char *fun(char *p) { return p; }的返回值是________________。

A)无确切的值B)形参p中存放的地址值

C)一个临时存储单元的地址D)形参p自身的地址值

65.若有定义int*f();中,标识符f代表的是______________。

A) 一个用于指向整型数据的指针变量B) 一个用于指向一维数组的行指针

C) 一个用于指向国致的指针变量D) 一个返回值为指针型的函数名

66.若有定义int(*p)();标识符p可以________________。

A) 表示函数的返回值B) 指向函数的入口地址

C) 表示函数的返回类型D) 表示函数名

67.若有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方法是_______。

A) p=max;B) p=max(a, b);C) *p=max;D) *p=max(a, b);

68. 若有函数max(a, b),并且已使函数指针变量p指向函数max,当调用该函数时,正确的调用方法是_____________________。

A) (*p)max(a, b) B) *pmax(a, b);C) (*p)(a, b);D) *p (a, b);

69.若有以下说明和定义:

fun(int *c) {……}

void main()

{

int (*a)()=fun, *b(), w[10], c;

……

}

在必要的赋值之后,对fun函数的正确调用语句是_________________。

A) a=a(w);B) (*a)(&c);C) b=*b(w); D) fun(b);

70.若有定义int (*p)();则p是_________________。

A)一维数组的指针变量B)函数的指针变量

C) 二级指针变量D) 字符串的指针变量

71.程序中若有如下说明和定义:

char fun(char *);

void main()

{ char *s="one", a[5]={0}, (*f1)()=fun, ch;

……

}

则对函数fun的正确调用语句是____________。

A) (*f1)(a);B) *f1(*s);C) fun(&a); D) ch=*f1(s);

72.以下与int *q[5];等价的定义是__________。

A) int q[5]; B) int *q; C) int *(q[5]); D) int (*q)[5];

73.以下正确的是______________。

A) int *b[]={1, 3, 5, 7, 9};

B) int a[5], *num[5]={&a[0], &a[1], &a[2], &a[3], &a[4] };

C) int a[]={1, 3, 5, 7, 9}, *num[5]={a[0], a[1], a[2], a[3], a[4] };

D) int a[3][4], (*num)[4]; num[1]=&a[1][3];

74.若有定义int b[4][4],*p, *q[4];且0≤i<4,则不正确的赋值语句是_____________。

A) q[i]=b[i]; B) p=b[i][i]; C) p=b[i]; D) q[i]=&b[0][0];

75有以下程序段:

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]

76.关于主函数的形式参数,下列说法正确的是_____________。

A) 是在程序编译时获得实际值B) 不可以由用户自己定义名字

C) 类型可以是实型D) 可以有两个

77.不合法的main函数形式参数表示是____________。

A) main(int a, char *c[]) B) main(int arc, char **arv)

C) main(int argc, char *argv) D) main(int argv, char *argc[])

78.假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的DOS提示符下键入:PROG ABCDEFGH IJKL回车,则输出结果为______________。

# include

void main(int argc, char *argv[])

{

while(--argc>0) printf("%s", argv[argc]);

}

A) ABCDEFGH B) IJKL C) ABCDEFGHIJKL D) IJKLABCDEFGH

79.有以下程序:

# include

# include

void main(int argc, char *argv[])

{

int i, len=0;

for(i=1;i

printf("%d", len);

}

程序生成的可执行文件是exl.exe,若运行时输入带参数的命令行是:exl abcd efg 10回车,则输出结果是___________。

A) 17 B) 16 C) 12 D) 9

80.若定义了以下面数:

void f(……)

{ ……

*p=(double *)malloc(10*sizeof(double));

……

}

p是该函数的形参,要求通过p把动态分配存储单元的地址传回主调函数,则形参p的正确定义应当是____________。

A) double *p; B) float **p; C) double **p; D) float *p

81.有以下程序

# include

# include

void main()

{

char *p, *q;

p=(char *)malloc(sizeof(char)*20); q=p;

scanf("%s%s",p,q); printf("%s %s", p, q);

}

程序执行后若从键盘上输入:abc def回车,则输出结果是___________。

A) def def B) abc def C) abc d D) d d

82.若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的动态存储分配语句是________________。

A) p=2*(int *)malloc(sizeof(int)); B) p=(int *)malloc(2*sizeof(int));

C) p=(int *)malloc(2*sizeof(unsigned int)); D) p= (int *)calloc(2,sizeof(int));

二、填空题

1.在C程序中,指针变量能够赋_________值或__________值。

2.执行语句printf("%d",NULL);后的输出结果是_____________________。

3.在C语言中,数组名是一个不可改变的_____________,不能对它进行赋值运算。

4.若有定义:int a[]={{1, 2, 3, 4, 5, 6, 7, 8}, *s=a; 则*(s+1)的值是_________。

5.若有定义:int a[4]={{0, 1, 2, 3}, *p; p=&a[1]; 则++(*p)的值是_________。

6.有以下程序段:

int *p[3], a[6], i;

for(i=0; i<3; i++) p[i]=&a[2*i];

则*p[0]引用的是a数组元素___________,*(p[1]+1)引用的是a数组元素_________。

7.若定义了int a[10], *p; 将数组元素a[8]的地址赋给指针变量p的赋值语句是___________。

8.若有定义:int a[10]={1, 2, 3};则*(a+3)的值是___________。

9.若有定义int w[10]={23, 54, 10, 33, 47, 98, 72, 80, 61}, *p=w; 则不移动指针p,且通过指针p引用值为98的数组元素的表达式是________________。

10. 若有定义int a[2][3]={2, 4, 6, 8, 10, 12}; 则*(&a[0][0]+2*0+)1的值是________,*(a[1]+2)的值是________。

11. 若有定义int a[3][2]={2, 4, 6, 8, 10}; 则*(a[1]+1)的值是________。

12. 若有定义int a[3][4]={{1, 3, 5, 7},{2, 4, 6, 8}}; 则*(*a+1)的值是________。

13. 若有定义short a[3][4]; 如果数组a首地址为2000,则a+1的地址是________。

14. 若有定义int a[2][4], (*p)[4]=a; 用指针变量p表示数组元素a[1][2]为________。

15. 若有定义:char a[]="shanxixian",*p=a;int i; 则执行语句for(i=0; *p!='\0'; p++,i++); 后i的值为___________。

16. 下面程序段执行后的输出结果是_________________。

char *p="abcdefgh"; p+=4;

printf("%c", *p++);

}

17. 若有定义char a[15]="Windows-9x"; 执行语句printf("%s",a+8); 后的输出结果是_________________。

18. 无返回值函数fun用来求出两整数x,y之和,并通过形参z将结果传回,假定x, y, z均是整型,则函数应定义为_________________。

19. 已知函数原型void fun(int *x, int *y); 则指向fun的函数指针变量p的定义是_________________。

20.函数调用时,若形参是一个指针变量,而对应的实参是一个数组名,则函数参数的传递方式是______________传递。

21. 若有定义int a=100, *p1=&a, **p2=&p1; 则表达式**p2的值是_________________。

22.设有一个名为"myfile.c"的C程序,其主函数为main(int argc, char *argv[])。如果在执行时,输入的命令行为myfile aa bb回车,则形式参数argc的值是___________。

23. 若有定义double *p;请写出利用malloc函数使p指向一个双精度型的动态存储单元的完整语句为___________________。

24. 调用库函数malloc,使字符指针st指向具有11个字节的动态存储空间的语句是___________________。

25.指针p分配三个double型动态内存单元的语句为____________________。

三、程序阅读题

1. 简要说明下面程序的功能。

# include

void main()

{

char a[100], b[100], *p, *q; int m;

gets(a);

scanf("%d", &m);

p=a; q=b;

for(p=p+m-1; *p!='\0'; p++, q++)

*q=*p;

*q='\0';

printf("%s",b);

}

2.写出下面程序执行后的运行结果。# include

void main()

{

char *p="abcdefgh", *r;

long *q;

q=(long *)p;

q++;

r=(char *)q;

printf("%s", r);

}

3.写出下面程序执行后的运行结果。# include

int fun(char *s, char a, int n)

{

int j;

*s=a; j=n;

while(*s

return j;

}

void main()

{

char c[6]; int i;

for(i=1; i<=5; i++)

*(c+i)='A'+i+1;

printf("%d", fun(c, 'E', 5));

}

4.写出下面程序执行后的运行结果。# include

# include

void sort(char *a[], int n)

{

int i, j, k; char *t;

for(i=0; i

k=i;

for(j=i+1;j

if(strcmp(a[j], a[k])<0) k=j;

if(k!=i) {t=a[i]; a[i]=a[k]; a[k]=t;}

}

}

void main()

{

char ch[4][15]={"morning:, "afternoon", "night", "evening"};

char *name[4]; int k;

for(k=0; k<4; k++) name[k]=ch[k];

sort(name, 4);

for(k=0; k<4; k++) printf("%s\n", name[k]);

}

5.下面程序运行时从键盘上依次输入:abcd回车、abba回车和abc回车三个字符串,写出程序的运行结果。

# include

# include

char *scmp(char *s1, char *s2)

{

if(strcmp(s1, s2)<0)

return s1;

else

reutrn s2;

}

void main()

{

int i; char string[20], str[3][20];

for(i=0; i<3; i++) gets(str[i]);

strcpy(string, scmp(str[0], str[1]));

strcpy(string, scmp(string, str[2]));

printf("%s",string);

}

6.写出下面程序执行后的运行结果。

# include

void fun(char *p)

{

char *q;

q=p;

while(*q!='\0') {

(*q)++; q++;

}

}

void main()

{

char a[]={"Program"}, *p;

p=&a[3];

fun(p);

printf("%s",a);

}

7.写出下面程序执行后的运行结果。

# include

char *ss(char *s)

{

char *p, t;

p=s+1; t=*s;

while(*p) { *(p-1)=*p; p++; }

*(p-1)=t;

return s;

}

void main()

{

char *p, str[10]="abcdefgh";

p=ss(str);

printf("%s", p);

}

8.写出下面程序执行后的运行结果。

# include

# include

void f(char *s, char *t)

{

char k;

k=*s; *s=*t; *t=k;

s++; t--;

if(*s) f(s, t);

}

void main()

{

char str[10]="abcdefg:, *p;

p=str+strlen(str)/2+1;

f(p, p-2);

printf("%s", str);

}

9.写出下面程序执行后的运行结果。

# include

# include

void f(char *p[], int n)

{

char *t; int i, j;

for (i=0; i

for(j=j+1; j

if(strcmp(p[i], p[j])>0)

{

t=p[i]; p[i]=p[j]; p[j]=t;

}

}

void main()

{

char *p[5]={"abc", "aabdfg", "abbd", "dcdbe", "cd"};

f(p, 5);

printf("%d", strlen(p[0]));

}

10.下面程序运行时从键盘上输入:3, abcde回车,写出程序的运行结果。# include

# include

void move(char *str, int n)

{

char temp; int i;

temp=str[n-1];

for(i=n-1; i>0; i--) str[i]=str[i-1];

str[0]=temp;

}

void main()

{

char s[50]; int n, i, z;

scanf("%d, %s",&n, s);

z=strlen(s);

for(i=1;i<=n;i++)

move(s, z);

printf("%s",s);

}

11.写出下面程序执行后的运行结果。

# include

void sub(char *a, int t1, int t2)

{

char ch;

while(t1

ch=*(a+t1); *(a+t1)=*(a+t2); *(a+t2)=ch; t1++; t2--;

}

}

void main()

{

char s[12]; int i;

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

s[i]='A'+i+32;

sub(s, 7, 11);

for( i=0; i<12; i++) printf("%c", s[i]); }

12. .写出下面程序执行后的运行结果。

# include

void LE(int *a, int b)

{

int x=*a;

printf("%d %d\n", *a, b);

*a=b; b=x;

}

void main()

{

int x=10, y=25;

LE(&x, y);

printf("%d %d\n", x, y);

}

13.写出下面程序执行后的运行结果。

# include

int c;

int func(int *a, int b)

{

c=(*a)*b; *a=b-1; b++;

return (*a+b+1);

}

void main()

{

int a=4, b=2, p=0;

p=func(&b, a);

printf("%d,%d,%d,%d",a,b,c,p);

}

14.写出下面程序执行后的运行结果。

# include

void fun(int *a, int i, int j)

{

int t;

if(i

t=a[i]; a[i]=a[j]; a[j]=t;

i++; j--;

fun(a, i, j);

}

}

void main()

{

int x[]={2, 6, 1, 8}, i;

fun(x, 0, 3);

for(i=0; i<4; i++) printf("%d", x[i]);

}

15.写出下面程序执行后的运行结果。

# include

void fun(int *n)

{

while((*n)--);

printf("%d", ++(*n));

}

void main()

{

int a=100;

fun(&a);

}

16. 写出下面程序执行后的运行结果。

# include

void main()

{

char *a[]={"Pascal", "C Language", "dBase", "Java"};

char (**p)[]; int j;

p=a+3;

for(j=3; j>=0; j--) printf("%s\n", *(p--));

}

17.写出下面程序执行后的运行结果。

# include

void main()

{

char *p[]={"3697", "2584"};

int i, j; long num=0;

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

{

j=0;

while(p[i][j]!='\0') {

if((p[i][j]-'0')%2) num=10*num+p[i][j]-'0';

j+=2;

}

}

printf("%d",num);

}

四、程序填空题

1.下面函数的功能是将将一个字符串转换为一个整数,例如:"1234"转换为整数1234。请填空使程序完整、正确。

# include

int chnum(char *p)

{

int num=0, k, len, j;

len=strlen(p);

for(;【______________】;p++)

{

k=【______________】; j=(--len);

while(【______________】) k=k*10;

num=num+k;

}

return (num);

}

2. 下面函数的功能是用递归法求数组中的最大值及下标值。请填空使程序完整、正确。 void findmax(int *a, int n, int i, int *pk)

{

if(i

if(a[i]>a[*pk]) 【______________】;

findmax(【______________】);

}

}

3.下面函数的功能是首先对a 所指的N 行N 列矩阵,找出各行中的最大的数,再求这N 个最大值中的最小的那个数作为函数值返回。请填空使程序完整、正确。

# define N 100

int fun(int(*a)[N])

{

int row, col, max, min;

for(row=0;row

for(max=a[row][0], col=1; col

if(【______________】) max=a[row][col];

if(row==0) min=max;

else if(【______________】) min=max;

}

return min;

}

4.下面函数的功能是根据公式1*2)1( (71)

51

31

11

--++-+-=-n s n 计算s ,计算结果通过形参指针sn 传

回;n通过形参传入,n的值大于等于0。请填空使程序完整、正确。

void fun(float *sn, int n)

{

float s=0.0, w, f=-1.0; int i=0;

for (i=0; i<=n; i++) {

f=【______________】*f;

w=f/(2*i+1);

s+=w;

}

【______________】=s;

}

5.下面函数的功能是用递归法将一个整数存放到一个字符数组中,存放时按逆序存放,如483存放成“384”。请填空使程序完整、正确。

void convert(char *a, int n)

{

int i;

if((i=n/10)!=0) convert(【______________】, i);

*a=【______________】) continue;

}

6.下面函数的功能是计算str所指字符串的长度,并作为函数值返回。请填空使程序完整、正确。int mystrlen(char *str)

{

int i;

for(i=0; 【______________】!='\0'; i++);

return【______________】;

}

7.下面函数的功能是将两个字符串s1和s2连接起来。请填空使程序完整、正确。

void conj(char *s1, char *s2)

{

char *p=s1;

while (*s1)【______________】;

while(*s2) {

*s1=【______________】;

s1++; s2++;;

}

*s1='\0';

}

8.下面函数的功能是从输入的十个字符串中找出最大的那个串。请填空使程序完整、正确。

# include

void fun(char str[10][81], char **sp)

{

int i;

*sp=【______________】;

for(i=1;i<10;i++)

if(strlen(*sp) < strlen(str[i]))

【______________】;

}

9.下面函数的功能是统计子串substr在母串str中出现的次数。请填空使程序完整、正确。

# include

int count(char *str, char *substr)

{

int i, j, k, num=0;

for(i=0; 【______________】;i++)

for(【______________】,k=0;substr[k]==str[j];k++,j++)

if(substr[【______________】]=='\0') {

num++; break;

}

return num;

}

10.下面函数的功能是以下函数fun的功能是返回str所指字符串中以形参c中字符开头的后续字符串的首地址,例如:str所指字符串为"Hello!",c中的字符为e,则函数返回字符串"ello!"的首地址。若str所指字符串为空串或不包含c中的字符,则函数返回NULL。请填空使程序完整、正确。

# include

char *fun(char *str, char c)

{

int n=0; cahr *p-str;

if(p!=NULL)

while(*p!=c && *p!='\0') 【______________】;

if(p=='\0') return NULL;

return 【______________】;

}

11.下面程序的功能是将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为556,则输出十进制整数366。请填空使程序完整、正确。

# include

void main()

{

char s[6], *p=s; int n;

gets(p); n=*p-'0';

while(【______________】!='\0') n=n*8+*p-'0';

printf("%d", n);

}

12.下面程序的功能是用指针法输出二维数组,每行三个数。请填空使程序完整、正确。

# include

void main()

{

int i, j, a[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9}, (*p)[3];

【______________】;

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

{

for(j=0; j<3; j++) printf("%5d", 【______________】);

printf("\n");

}

}

13.下面程序的功能是输入一个数字(范围在0~9之间,若不在此范围内显示输入错),输出对应的英文单词(Zero,One,Two,……,Nine)。请填空使程序完整、正确。

# include

void main()

{

int i; char *digit[10]={"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};

scanf("%d", &i);

if(【______________】) printf("%s", digit[【______________】]);

else printf("输出错误!\n");

}

14.下面函数huiwen的功能是检查一个字符串是否是回文,当字符串是回文时,函数返回字符串:yes!,否则函数返回字符串:no!,并在主函数中输出,所谓回文即正向与反向的拼写都一样,例如:adgda。请填空使程序完整、正确。

# include

# include

char *huiwen(char *str)

{

char *p1, *p2; int i, t=0;

p1=str; p2=【______________】;

for(i=0; i<=strlen(str)/2; i++)

if(*p1++!=*p2--) { t=1; break; }

if(【______________】) return ("yes!");

else return("no!");

}

void main()

{

char str[50];

scanf("%s", str);

printf("%s",【______________】);

}

15.下面程序中select函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标。请填空使程序完整、正确。

# include

# define N 3

# define M 3

int select( int a[N][M], int *n)

{

int i, j, row=1, colum=1;

第十章 指针

第十章指针 一、选择题 1.变量的指针,其含义是指该变量的_______________。 A) 值B) 地址C) 名D)一个标志 2.已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值是________________。 A)k=*ptr1+*ptr2 B) ptr2=k C) ptr1=ptr2D)k=*ptr1*(*ptr2) 3.若有定义int *p, m=5,n;以下程序段正确的是________________。 A) p=&n; B) p=&n; scanf("%d",&p); scanf("%d",*p); C) scanf("%d",&n); D) p=&n; *p=n; *p=m; 4.若有定义:int *p1, *p2, m=5, n;以下____________是正确的赋值语句。 A) p1=&m; p2=&p1; B)*p1=*p2; C) p1=&m; p2=p1; D) p1=&m; *p2=*p1; 5.若有int *p, a=4;和p=&a;下面____________均代表地址。 A) a, p, *&a B)&*a, &a, *p C) *&p, *p, &a D)&a, &*p, p 6.若变量已正确定义并且指针p已经指向变量x,则*&x相当于____________。 A) x B) p C) &x D) &*p 7.若定义了int m, n=0, *p1=&m;则下列____________表达式与m=n等价。 A) m=*p1 B)*p1=&*n C) *&p1=&*n D) *p1=*&n; 8. 假如指针p已经指向整型变量x,则(*p)++相当于____________。 A) x++ B) p++ C) *(p++) D) &x++ 9. 对于基类型相同的两个指针变量之间,不能进行的运算是____________。 A) < B) = C) + D) - 10. 若程序中已包含头文件stdio.h,以下选项中正确运用指针变量的程序段是__________。 A) int *i=NULL; B) float *f=NULL scanf("%d",i); *f=10.5; C) char t='m',*c=&t; D) long *L; *c=&t; L='\0'; 11. 有如下函数和变量定义int a=25; 执行语句print_value(&a);后的输出结果是___________。 void print_value(int *x) { printf("%d",++*x); } A) 23 B) 24 C) 25 D) 26 12. 若有定义:char s[10]; 则在下面表达式中不表示s[1]的地址的是___________。 A) s+1 B) s++ C) &s[0]+1 D) &s[1] 13.若有定义:int a[5], *p=a; 则对a数组元素的正确引用是_____________。 A)*&a[5]B)a+2 C)*(p+5) D)*(a+2) 14. 若有定义:int a[5], *p=a; 则对a数组元素地址的正确引用是_____________。 A)p+5B)*a+1 C)&a+1 D)&a[0] 15. 若有定义:int a[5]; 则a数组中首元素的地址可以表示为_____________。 A)&a B)a+1 C)a D)&a[1] 16. 若要对a进行合法的自减运算,则之前应有下面___________的说明。 A) int p[3]; B) int k; C) char *a[3]; D) int b[10];

C程序设计第三版第十章题解

第十章指针 10.1 输入3个整数,按照从小到大的顺序输出 #include void main() { void swap(int *p1, int *p2); int n1,n2,n3; int *p1,*p2,*p3; printf("input three integer:"); scanf_s("%d,%d,%d",&n1,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if(n1>n2) swap(p1,p2); if(n1>n3) swap(p1,p3); if(n2>n3) swap(p2,p3); printf("the order: %d,%d,%d\n",n1,n2,n3); } void swap(int *p1, int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } NOTE:scanf的参数为地址,printf参数为参数 10.2输入三个字符串,按照从小到大的顺序输出 #include #include void main() { void swap(char *p1, char *p2); char str1[20],str2[20],str3[20]; printf("input three string:"); gets_s(str1); gets_s(str2); gets_s(str3); if(strcmp(str1,str2)) swap(str1,str2);

if(strcmp(str1,str3)) swap(str1,str3); if(strcmp(str2,str3)) swap(str2,str3); printf("the order: %s,%s,%s\n",str1,str2,str3); } void swap(char *p1, char *p2) { char temp[20]; strcpy(temp,p1); strcpy(p1,p2); strcpy(p2,temp); } NOTE:gets()用于获取字符串输入。strcmp() 和strcpy()的应用 10.3 输入10个整数,将其中最小的数和第一个数对换,把最大的数和最后一个数对换,写三个函数:①输入十个数;②进行处理;③输出十个数 #include void main() { void input(int *); void output(int *); void proceed(int *); int number[10]; input(number); proceed(number); output(number); } void input(int *number) { int i; printf("input ten integer:\n"); for (i=0;i<10;++i) { scanf("%d",&number[i]); } } void proceed(int *number)

第10章指针类型习题及答案

第十章指针类型习题及其答案 10-2 定义指针变量p,q,r,让它们指向变量a,b,c,在指向d,e,f,最后指向变量x,y,z,然后输出p,q,r与*p,*q,*r. 解:int a,b,c,d,e,f,x,y,z ; int *p,*q,*r ; p=&a;q=&b;r=&c ; p=&d;q=&e;r=&f ; p=&x;q=&y;r=&z ; printf(“%l,%l,%l”,p,q,r) ; printf(“%d,%d,%d”,*p,*q,*r) ; 思考:指针也是一种数据类型吗?他可以不依赖其它数据类型而独立存在吗? 10-3 应用指针,实现10个整数从打到小的排序输出。 解:#include "stdio.h" void main() { int i,j,a[10],*p,t; printf("请输入10个整数:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<9;i++) { p=&a[i] ; for(j=i+1;j<10;j++) if(a[j]>*p) p=&a[j] ; t=*p;*p=a[i];a[i]=t; } printf("排序后的数组为:\n"); for(i=0;i<10;i++) printf("%d,",a[i]) ; } 思考:指针变量的值可以由键盘输入确定吗?它与其所指类型的变量值之间的关系如何?

10-4 应用指针,求n个数的最小值和最大值。 解:#include "stdio.h" #define L 100 void main() { int i,n,a[L],*max,*min; printf("请确定欲输入数据的个数(<100):"); scanf("%d",&n); printf("下面请依次输入%d的个数\n",n); for(i=0;i*max) max=&a[i]; if(a[i]<*min) min=&a[i]; } printf("最大值=%4d,最小值=%4d\n",*max,*min); } 思考:指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计? 10-5 应用指针,编写下列字符串处理函数: (1) 字符串的复制函数。 (2) 字符串的连接函数。 解:#include "stdio.h" void copy_string(char *from ,char *to) { for(;*from!='\0';from++,to++) *to=*from ; *to='\0';

第十章(指针)

1.补充程序,程序实现从10个数中找出最大值和最小值。 #include #include int max,min; void find_max_min(int *p,int n) { int *q; max=min=*p; for(q=p; q*q) min=*q; } void main() { int i,num[10]; printf("Input 10 numbers: "); for(i=0;i<10;i++) scanf("%d",&num[i]); find_max_min(/**/ num /**/,10); printf("max=%d,num=%d\n",max,min); } 2.补充程序,其中main函数通过调用average函数计算数组元素的平均值。 #include float average(int *pa,int n) { int k; /**/ float avg=0; /**/ for(k=0;k #include

第十章 指针(含答案)

第十章指针 一、选择题 1.以下程序的运行结果是【C】。 sub(int x,int y,int *z) {*z=y-x ;} main() { int a, b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(”%4d,%4d,%4d\n”,a,b,c); } A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-7 2.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】 A)s+1 B)s++ C)&s[0]+1 D)&s[1] 3.下列程序能对两个整型变量的值进行交换。以下正确的说法是【 D】。 main() { int a=10,b=20; printf("(1)a=%d,b=%d\n",a,b); swap(&a,&b); printf(“(2)a=%d,b=%d\n”a,b); } swap(int p, int q) { int t; t=p;p=q;q=t;} A. 该程序完全正确 B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可 C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指 针(执行语句不变)即可 D. 以上说法都不正确 4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。 (1)int *p,*q; q=p; int a,*p,*q;p=q=&a; (2)int a,*p,*q; q=&a; p=*q; int a=20, *p; *p=a; (3)int a=b=0,* p; p=&a; b=* p; int a=20,*p,*q=&a; *p=*q; (4)int a=20,*p,*q=&a; p=q; int p, *q; q=&p; A.正确:(1);不正确:(2),(3),(4) B.正确:(l),(4);不正确:(2),(3) C.正确:(3);不正确:(1),(2),(4) D.以上结论都不正确 5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。

C语言第十章习题答案

C程序设计[谭浩强](第三版)课后答案第十章指针2010-06-25 14:04 第十章指针 10.1 main() {int n1,n2,n3; int *p1,*p2,*p3; scanf("%d,%d,%d",&n1,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if(n1>n2)swap(p1,p2); if(n1>n3)swap(p1,p3); if(n2>n3)swap(p2,p3); printf("%d,%d,%d\n",n1,n2,n3); } swap(p1,p2) int *p1,*p2; {int p; p=*p1;*p1=*p2;*p2=p; } 10.2 main() {char *str1[20],*str2[20],*str3[20]; char swap(); scanf("%s",str1); scanf("%s",str2); scanf("%s",str3); if(strcmp(str1,str2)>0)swap(str1,str2); if(strcmp(str1,str3)>0)swap(str1,str3); if(strcmp(str2,str3)>0)swap(str2,str3); printf("%s\n%s\n%s\n",str1,str2,str3); } char swap(p1,p2) char *p1,*p2; {char *p[20]; strcpy(p,p1); strcpy(p1,p2); strcpy(p2,p); } 10.3 main() {int number[10]; input(number);

第十章练习题

第十章练习题 一、选择题 1.将逻辑值赋给内存变量LZ的正确方法是: A)LZ=“.T.”B)STORE “T” TO LZ C)LZ=TRUED)STORE .T. TO LZ 2.将98年国庆节的日期赋给内存变量ND的正确方法是: A)ND=DTOC(“10/01/98”)B)ND=CTOD([10/01/98]) C)STORE DATE()TO NDD)STORE 10/01/98 TO ND 3.执行命令INPUT “请输入出生日期:” TO MDATE时,如果通过键盘输入CTOD(“01/01/88”)则内存变量MDATE的值应当是: A)CTOD(“01/01/88”)B)“01/01/88” C)日期值01/01/88D)拒绝接收,MDATE不赋值 4.在DO WHILE .T.的循环中,退出循环应使用的命令是: A)LOOPB)EXITC)CLOSED)CLEAR 5.下列程序的运行结果是: A=10 IF A=10 S=0 ENDIF S=1 ?S A)0B)1C)程序出错D)结果无法确定 6.有如下的程序: M=0

N=0 DO WHILE N>M M=M+N N=N-10 ENDDO ?M 运行此程序后M的值为: A)0B)10C)100D)99 7.有如下程序: SET TALK OFF STORE 2 TO S,K DO WHILE S<14 S=S+K K=K+2 ENDDO ?S,K SET TALK ON RETURN 此程序运行后的输出结果是: A)2210B)228 C)148D)14108.执行如下程序:SET TALK OFF S=0 I=1

数据结构严蔚敏版第十章答案

第十章内部排序 10.23 void Insert_Sort1(SqList &L)//监视哨设在高下标端的插入排序算法 { k=L.length; for(i=k-1;i;--i) //从后向前逐个插入排序 if(L.r[i].key>L.r[i+1].key) { L.r[k+1].key=L.r[i].key; //监视哨 for(j=i+1;L.r[j].key>L.r[i].key;++j) L.r[j-1].key=L.r[j].key; //前移 L.r[j-1].key=L.r[k+1].key; //插入 } }//Insert_Sort1 10.24 void BiInsert_Sort(SqList &L)//二路插入排序的算法 { int d[MAXSIZE]; //辅助存储 x=L.r.key;d=x; first=1;final=1; for(i=2;i<=L.length;i++) { if(L.r[i].key>=x) //插入前部 { for(j=final;d[j]>L.r[i].key;j--) d[j+1]=d[j]; d[j+1]=L.r[i].key; final++; } else //插入后部 { for(j=first;d[j]

第十章 指针

第十章指针 本章重点: 指针变量和指针运算符。 指针用作函数参数。 指针与数组。 10.1指针的基本概念 一、地址 在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(8位),它们都有一个编号,这个编号就是内存地址。如下图所示: 注意:1、程序中定义的每个数据在编译后都占有各自的内存区。 2、数据所占有的存储单元个数是由其类型决定的。 3、首地址:第1个单元的地址, 4、表示地址的数与整数的区别: 5、系统通过变量名对内存单元进行访问 2.数据在内存中的存储 整型变量---分配2个字节单元 实型变量—分配4个字节单元 字符变量—分配1个字节单元

2.内存单元的地址与内存单元的内容。 printf(“%d”,i); scanf(“%d”,&i); 的操作过程。 3.对变量值的访问方式 (1)直接访问:按变量地址存取变量值的方式。 (2)间接访问方式:将变量的地址存放在另一个变量当中,通过对另一变量来访问变量。 4.指针:就是变量的地址。 指针变量:用于存放变量地址的变量。 10.2 指针变量和指针运算符 一.指针变量的定义 1.格式:类型名*指针变量名; 2、举例 int *p1; char *s1, *s2; float *a1, *a2, f; 3、说明 a. 类型名:指针变量所指向的变量类型。 b. “*” 是定义指针变量的标志,不可丢掉。 c. 指针变量定义后,其值是不确定的。 4、赋值:可以进行初始化,也可以使用赋值语句 (1)、初始化:int a, *s=&a;

(2)、赋值语句 int a, *s; s=&a; 3)、注意:只能用同类型变量的地址进行赋值! 如定义:int *s; float f; 则s=&f;是非法的。 二. 指针变量的引用 1、两个运算符:& 与* &:取地址,注意与作位运算符时的不同(双目) *:取内容,注意与作乘运算符时的不同(双目) 2、说明 a. &既可作用于一般变量,也可作用于指针变量 b. * 只能作用于指针变量 c. 定义指针变量时的* 与该处的含义不同 3、指针变量可以进行的操作 (1)赋值:int a, *p1=&a, *p2; p2=p1; 下面的赋值是不合法的: int *ip; ip=100; 假设: int i=200, x; int *ip; ip=&i; x=*ip; 通过指针变量ip间接访问变量i, (2)输出:printf(“%x”,p1); (3)增减:p1++; p2--; p1+=4; (只能和一个整数) p+n 不论指针变量指向何种数据类型, 指针和整数进行加、减运算时, 编译程序总根据所指对象的数据长度对n放大。 (4). 两个指针变量在一定条件下, 可进行 减法运算。设p, q指向同一数组, 则p-q的绝对 值表示p所指对象与q所指对象之间的元素个 数。 例1 #include main( ) { int a1=11, a2=22; int *p1, *p2;

C语言 第十章 指针

第十章指针 A部分(本、专科必做) 一、选择题 1、若有定义:int x,*pb;则以下正确的表达式是(A) A、pb=&x B、pb=x C、*pb=&x D、*pb=*x 2、以下程序的输出结果是(B) A、因变量无定义输出不定值 B、0 C、-1 D、1 #include void main() {printf(“%d\n”,NULL);} 3、以下程序的输出结果是(B) A、5,2,3 B、-5,-12,-7 C、-5,-12,-17 D、5,-2,-7 #include void sub(int x,int y,int *z) {*z=y-x;} void main() { int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(“%d,%d,%d\n”,a,b,c); } 4、以下程序的输出结果是(C) A、4 B、6 C、8 D、10 #include void main() { int k=2,m=4,n=6; int *pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf(“%d\n”,n); }

5、已知指针p的指向(图一)的a[1],则执行语句*p++;后,*p的值是(B)。 A、20 B、30 C、21 D、31 a[0] a[1] a[2] a[3] a[4] 10 20 30 40 50 (图一) 6、已知指针p的指向(图一)的a[1],则表达式*++p的值是(B)。 A、20 B、30 C、21 D、31 7、已知指针p的指向(图一)的a[1],则表达式++*p的值是(C)。 A、20 B、30 C、21 D、31 8、以下程序的输出结果是(D)。 A、23 B、24 C、25 D、26 #include void prtv(int *x) {printf(“%d\n”,++*x);} void main() { int a=25;prtv(&a); } 9、以下程序的输出结果是(B)。 A、运行出错 B、100 C、a的地址 D、b的地址 #include void main() { int **k,*a,b=100; a=&b;k=&a; printf(“%d\n”,**k); }

第十章 习题及答案

第十章习题 一、选择题 1.以下叙述中正确的是________。 A)C语言中的文件是流式文件,因此只能顺序存取数据 B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖 C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据 D)当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失 2.当已存在一个abc.txt文件时,执行函数fopen (“abc.txt”, “r++”)的功能是。 A)打开abc.txt文件,清除原有的内容 B)打开abc.txt文件,只能写入新的内容 C)打开abc.txt文件,只能读取原有内容 D)打开abc.txt文件,可以读取和写入新的内容 3.若fp是指向某文件的指针,且已读到此文件末尾,则库函数feof(fp)的返回值是。 A) EOF B) 0 C) 非零值 D) NULL 4.以下程序企图把从终端输入的字符输出到名为abc.txt的文件中,直到从终端读入字符#号时结束输入和输出操作,但程序有错。 #include main() { FILE *fout; char ch; fout=fopen('abc.txt','w'); ch=fgetc(stdin); while(ch!='#') { fputc(ch,fout); ch =fgetc(stdin); fclose(fout); } 出错的原因是。 A) 函数fopen调用形式有误 B) 输入文件没有关闭 C) 函数fgetc调用形式有误

D) 文件指针stdin没有定义 5.有以下程序 #include main() { FILE *pf; char *s1=〞China〞,*s2=〞Beijing〞; pf=fopen(〞abc.dat〞,〞wb+〞); fwrite(s2,7,1,pf); rewind(pf); fwrite(s1,5,1,pf); fclose(pf); } 以下程序执行后abc.dat文件的内容是 A)China B)Chinang C)ChinaBeijing D)BeijingChina 6.有以下程序 #include main () {FILE *fp; int i,a[6]={1,2,3,4,5,6}; fp=fopen(“d3.dat”,”w+b”); fwrite(a,sizeof(int),6,fp); fseek(fp,sizeof(int)*3,SEEK_SET); fread(a,sizeof(int),3,fp); fclose(fp); for(i=0;i<6;i++) printf(“%d,”,a[i]); } 程序运行后的输出结果是( ) A)4,5,6,4,5,6, B)1,2,3,4,5,6, C)4,5,6,1,2,3, D)6,5,4,3,2,1, 7.有以下程序 #include main() {FILE *fp; int a[10]={1,2,3},i,n; fp=fopen(“dl.dat”,”w”); for(i=0;i<3;i++) fprintf(fp,”%d”,a[i]); fprintf(fp,”\n”); fclose(fp); fp=fopen(“dl.dat”,”r”); fscanf(fp,”%d”,&n); fclose(fp); printf(“%d\n”,n);

第十章指针上机习题

第十章指针 问题与思考 一、选择题 1.变量的指针,其含义是指该变量的________. a)值 b)地址 c)名 d)一个标志 2.若有说明;int *p,m=5,n;以下正确的程序段的是________. a)p=&n; b)p=&n; scanf("%d",&p); scanf("%d",*p); c)scanf("%d",&n); d)p=&n; *p=n; *p=m; 3.若有以下定义,则对a数组元素的正确引用是_________. int a[5],*p=a; a) *&a[5] b) a+2 c) *(p+5) d) *(a+2) 4.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______. a) *(a[i]+j) b) (a+i) c) *(a+j) d) a[i]+j 5. 下面程序段的运行结果是_________. char *s="abcde"; s+=2;printf("%d",s); a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果 6.以下正确的程序段是_________. a)char str[20]; b)char *p; scanf("%s",&str); scanf("%s",p); c)char str[20]; d)char str[20],*p=str; scanf("%s",&str[2]); scanf("%s",p[2]); 7.若有说明语句 char a[]="It is mine"; char *p="It is mine"; 则以下不正确的叙述是________. a)a+1表示的是字符t的地址 b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符 8.下面程序的运行结果是_______. #include #include main() { char *s1="AbDeG"; char *s2="AbdEg"; s1+=2;s2+=2; printf("%d\n",strcmp(s1,s2)); }

第十章补充习题

第十章补充习题1 一、选择题 1、若有定义:int x,*pb; 则以下正确的赋值表达式是 A)pb=&x B)pb=x C)*pb=&x D)*pb=*x 2. 以下程序的输出结果是 A)5,2,3 B)-5,-12,-7 C)-5,-12,-17 D)5,-2,-7 void sub(int x,int y,int *z) { *z=y-x; } main() { int a,b,c; sub(10,5,&a);sub(7,a,&b);sub(a,b,&c); printf("%d,%d,%d\n",a,b,c); } 3. 以下程序的输出结果是 A)4 B)6 C)8 D)10 main() { int k=2,m=4,n=6; int *pk=&k, *pm=&m, *p; *(p=&n)= *pk*(*pm); printf(―%d\n‖,n); } 4. 已知指针p的指向如图10.1所示,则执行语句*p++;后,*p的值是 A)20 B)30 C)21 D)31 5. 已知指针p的指向如图10.1所示,则表达式*++p的值是 A)20 B)30 C)21 D)31 6. 已知指针p的指向如图10.1所示,则表达式++*p的值是 A)20 B)30 C)21 D)31 7. 以下程序的输出结果是 A)23 B)24 C)25 D)26 void prtv(int *x) { printf(―%d\n‖,++*x); } main()

{ int a=25;prtv(&a); } 8. 以下程序的输出结果是 A)运行出错B)100 C)a的地址D)b的地址main() { int **k,*a,b=100; a=&b;k=&a; printf("%d\n",**k); } 9. 以下程序的输出结果是 A)4,3 B)2,3 C)3,4 D)3,2 void fun(float *a,float *b) { float w ; *a=*a+*a; w=*a; *a=*b; *b=w; } main() { float x=2.0,y=3.0; float *px=&x,*py=&y; fun(px,py); printf("%2.0f,%2.0f\n ",x,y); } 10. 以下程序的输出结果是 A)9.000000 B)1.500000 C)8.000000 D)10.500000 void sub(float x,float *y,float *z) { *y=*y-1.0; *z=*z+x; } main() { float a=2.5,b=9.0,*pa,*pb; pa=&a; pb=&b; sub(b-a,pa,pa); printf("%f\n ",a); } 二、填空题 1. 以下程序的输出结果是。 int *var,ab; ab=100;var=&ab;ab=*var+10; printf("%d\n",*var);

补充练习第十章文件

补充练习第十章文件 第十章文件 一、单项选择题: 1.C语言把文件看作是一个的序列。 A. 记录 B. 单词 C. 字 D. 字符 2. 语句FILE *fp;定义了一个指向 . A. 某一个文件的变量 B. 某一个文件的结构体变量 C. FILE文件的变量 D. FILE变量的指针 3.标准输入文件由系统分配为。 A. 键盘 B. 显示器 C. 打印机 D. 鼠标 4.语句fp=fopen(“file1”,”r”); 表示。 A. 打开文件file1,可从该文件输入数据 B. 打开文件file1,可向该文件输出数据 C. 打开文件file1,可向该文件添加数据 D. 打开文件file1,可向该文件输入输出数据 5. 如果希望向文本文件末尾添加数据,则应以方式打开文件。 A. “r” B. “w” C. “a” D. “ab” 6.关闭文件函数fclose(fp)的作用是。 A. 不再为fp指向的文件分配内存空间 B. 将fp指向的文件存入磁盘 C. 释放指定文件所占据的内存空间和文件指针 D. 将指定文件封闭在某一内存区域 7. 下面列出四组函数名,其中组为标准文件的输出函数。 A. getchar(),gets(),scanf() B. putchar(),puts(),printf() D. fgetc(),fgets(),fscanf() D. fputc(),fputs(),fprintf() 8. 文件是以为结束符的。 A. NULL B. EOF C. $ D. \n 9.若对文件fp操作出错,则函数ferror(fp)的返回值为。 A. 0 B. –1 C. 1 D. 非零 10. 已知函数fread的调用形式为fread(buffer, size, count, fp),其中buffer代表的

谭浩强版C语言的第十章《指针》答案

谭浩强版C语言的第十章《指针》答案 第十章《指针》答案如下 inc/testPtr.h #include #include #include #include #define SIZE 1024 int a2i(char *start, char *end) { int size = 0, ret = 0; long base = 0; size = end - start + 1; base = (long)pow(10, size - 1); while(size-- > 0) { ret += (*start++ - '0') * base; base /= 10; } return ret; } int extraNum(char *str, int arr[]) { int ite = 0, counter = 0; char *start = NULL, *end = NULL; while(*str != '\0') { if(isdigit(*str)) { start = end = str; while( isdigit(*end) && *end != '\0') { ++end; }

arr[ite++] = a2i(start, end-1); str = end; } else { str++; } } return ite; } int sortStr(char *arr[], int size) { int ite1 = 0, ite2 = 0, minPos = 0; char *tmp; for(ite1 = 0; ite1 < size - 1; ite1++) { minPos = ite1; for(ite2 = ite1 + 1; ite2 < size; ++ite2 ) { if( strcmp(arr[ite2], arr[minPos]) < 0 ) { minPos = ite2; } } if(minPos != ite1) { tmp = arr[minPos]; arr[minPos] = arr[ite1]; arr[ite1] = tmp; } } return 0; } int sort(int arr[], int size) {

第十章指针

第十章指针 通过本章实验作业应达目标 1.掌握使用指针变量的方法。 2.掌握带有指针形参的函数的定义及调用方法。 3.正确使用指针操作数组元素。 4.正确使用指针数组操作字符串。 本章上交作业 程序10_1_1.c,10_2_1.c,10_3_1.c,10_4_1.c上传至211.64.135.121/casp。 实验一指针作函数参数 【实验目的】 1.掌握指针概念及定义方法。 2.学会利用指针来求解实际问题。 【实验内容】 作业1.编写一个函数void swap(int *x,int *y),其中的x,y都是指向int的指针,功能是实现x,y所指向的两个int变量的值的交换。并写出函数调用过程。请以10_1_1.c命名本程序。 主函数如下: main( ) { void swap(int *x,int *y); int a,b; scanf("%d,%d",&a,&b); printf("before swap: a=%d,b=%d\n",a,b); 此处请写出函数调用过程; printf("after swap: a=%d,b=%d\n",a,b); } 【实验提示】 注意指针作为函数参数的写法。 实验二用指针对元素排序 【实验目的】 1.掌握指针概念及定义方法。 2.学会利用指针和数组来求解实际问题。 【实验内容】 作业1.给定主函数,编写三个函数input()、sort()、output(),分别实现数组元素的输入,数组元素的排序(升序)和数组元素的输出。请以10_2_1.c命名本程序。 #include "stdio.h" int i;

main( ) { void input(int *a,int n); void sort(int *a,int n); void output(int *a,int n); int a[10]; input(a,10); sort(a,10); output(a,10); } 【实验提示】 1.可以使用数组那一章讲到的任何一种排序算法。 2.本题关键是指向数组的指针变量的应用。由于将数组的首地址赋给了形参指针变量,所以可以在被调函数对指针变量所指向的地址处值的修改可以实现对主函数中数组元素值的修改。 【思考】 1.如果只想对a数组的前5个数排序,该如何调用sort函数? 2.如果只想对a数组的后5个数排序,该如何调用sort函数? 实验三测试是否子串函数 【实验目的】 1.掌握指针概念及定义方法。 2.学会利用指针和数组来求解实际问题。 【实验内容】 作业1.编写一个函数int delnum(int *a , int num , int n),用于在长度是n的数组a中,删除一个指定的元素num。并把删除后数组的长度作为函数的返回值。 请以10_3_1.c命名本程序。 主函数如下: # define N 10 main( ) { int a[N] , num; scanf(“%d”,&num); 输入N个数到数组a中; 调用delnum函数在数组a中删除指定的数num; 输出删除了num后的数组a; } 实验四字符串的交叉连接 【实验目的】 学会利用多个指针和字符数组来解决实际问题。

10第十章 文件习题

第十章文件 【例1】若fp已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof(fp)的值为________。 A) 0 B) 1 C) -1 D) 一个非0值【例2】设fp是指向某个文件的指针,且已读到文件末尾,则库函数feof(fp)的返回值是________。 A) EOF B) -1 C) 非零值 D) NULL 【例3】以下程序企图把从终端输入的字符输入的字符输出到名为abc.txt的文件中,直到从终端读入字符#号时结束输入和输出操作,但程序有错。 #include Main() { FILE*fout; char ch; Fout=fopen(ˊabc.txtˊ, ˊwˊ); Ch = fgetc(stdin); While(ch != ˊ#ˊ) { fputc(ch,fout); Ch = fgetc(stdin); } Fclose(fout); } 出错的原因是_______。 A) 函数fopen调用形式错误 B)输入文件没有关闭 C) 函数fgetc调用形式错误 D)文件指针stdin没有定义【例4】若要指定打开c盘上子目录myfile下的二进制文件test.bin,在调用函数fopen时,第一个函数的正确格式是_________。 A)“c:myfile\test.bin” B)“c\:myfile\\test.bin” C)“c\\:myfile\\test.bin” D)“c\:myfile\test.bin” 【例5】若要用fopen函数打开一个新的二进制文件,该文件既要能读也要能

写,则文件方式字符串是________。 A)“ab+” B)“wb+” C)“rb+” D)“ab” 【例6】在C语言中,用于关闭文件的函数是_______。 A)fopen B)fseek C)fclose D)ftell 【例7】正常执行文件关闭操作时,fclose函数的返回值是________。 A)-1 B)TRUE C)0 D)1 【例8】已知函数的调用形式是:fread(buffer,size,count,fp);其中buffer 代表的是__________。 A)一个整型变量,代表要读入的数据总数 B)一个文件指针,只想要读 的文件 C)一个指针,只想要读入数据的存放地址 D)一个存储 区,存放要读的数据项 【例9】在C程序中,把整型数以二进制形式存放到文件中的函数是________。 A)fprintf函数 B)fread函数 C)fwrite函数 D)fputc 函数 【例10】fwrite函数的一般调用形式是_________。 A)fwrite(buffer,count,size,fp); B)fwrite(fp,size,count,buffer); C)fwrite(fp,count,size,buffer); D) fwrite(buffer,size,count,fp); 【例11】在C语言中,用于向文件写入一个字符的函数是________。 A)fputs B)fgetc C)fgets D)fputc 【例12】若调用fputc函数输出字符成功,则其返回值是__________。 A)EOF B)1 C)0 D)输出的字符 【例13】函数调用语句fseek(fp,-20L,2);的含义是__________。 A)将文件位置指针移到距离文件头20个字节处 B)将文件位置指针从当前位置向后移动20个字节

相关主题