• 沒有找到結果。

float *search(float(*pointer)[4],int n) { float *pt;

pt=*(pointer+n);

return(pt);

}

运算结果如下:

enter the number of student;1<CR>

The scores of No.1 are :

56.00 89.00 67.00 88.00

学生序号是从 0 号算起的。函数 search 被定义为指针型函数,其形参 pointer 是指向包含 4 个元素的一维数组的指针变量。pointer+1 指向 score 数组第 1 行。

*(pointer+1)指向第 1 行第 0 列元素。

pt 是指针变量,它指向实型变量(而不是指向一维数组)。main 函数调用 search 函数,将 score 数组的首地址传给 pointer(注意 score 也是指向行的指针,而不是指向列元素的指针)。 m 是要查找的学生序号。调用 search 函数后,得到一个地址(指向第 m 个学生第 0 门课程), 赋给 p。然后将此学生的 4 门课的成绩打印出来。*(p+i)表示此学生第 i 门课的成绩。

注意指针变量 p、pt 和 pointer 的区别。如果将 search 函数中的语句 pt=*(pointer+n);改为:

pt=(*pointer+n);,则运行结果为:

enter the number of student:1 The score of No.1 are:

70.00 80.00 90.00 56.00

得到的不是第一个学生的成绩,而是二维数组中 a[0][1]开始的 4 个元素的值。

习题六

一、选择题

1.以下程序的输出结果是( )。

# include"stdio.h"

main() {

int a=25,*p=&a;

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

}

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

2.设有如下定义:

char *aa[2]={"abcd","ABCD"};

则下列说法中正确的是( )。

A.aa 数组元素的值分别是"abcd"和"ABCD"

B.aa 是指针变量,它指向含有两个数组元素的字符型数组

C.aa 数组的两个元素分别存放的是含有 4 个字符的一维字符数组的首地址 D.aa 数组的两个元素中各自存放了字符'a'和'A'的地址

3.以下程序的输出结果是( )。

#include"stdio.h"

main()

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

int *p=a+5,*q=NULL;

*q=*(p+5);

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

}

A.编译时报错 B.6 6 C.6 11 D.5 5 4.设有如下程序段:

char str[]="Hellow";

char *ptr=str;

其中*(ptr+6)的值为( )。

A.'0' B.'\0' C.6 D.'0'的地址 5.以下程序输出的结果是( )。

#include "stdio.h"

#include "string.h"

main()

{ char *p1="abc",*p2="ABC",str[50]="xyz";

strcpy(str+2,p1);

strcat(str,p2);

puts(str);

}

A.xyzabcABC B.xABCabc C.yzabcABC D.xyabcABC

6.对于类型相同的两个指针变量,它们之间不能进行的运算是( )。

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

7.以下程序的输出结果是( )。

#include "stdio.h"

main()

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

p=&a[1];

for(x=0;x<3;x++) y+=*(p+x);

printf("%d",y);

}

A.17 B.18 C.19 D.20 8.执行以下程序段后,m 的值为( )。

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

int m,*p;

p=&a[0][0];

m=(*p)*(*(p+2))*(*(p+4));

A.6 B.18 C.15 D.20 9.以下程序的输出结果是( )。

#include "stdio.h"

#include"string.h"

main()

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

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

}

A.0 B.5 C.7 D.20 10.以下程序的输出结果是( )。

#include "stdio.h"

main()

{ char a[]="programming",b[]="language";

char *p1=a,*p2=b;

int i;

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

if(*(p1+i)==*(p2+i))printf("%c",*(p1+i));

}

A.gm B.rg C.or D.ga 11.库函数 strcpy()用以复制字符串。若有以下定义和语句:

char str1[]="string",str2[8],*str3,*str4="string";

则对库函数 strcpy()的调用不正确的是( )。

A.strcpy(str1,"HELLO1"); B.strcpy(str2,"HELLO2");

C.strcpy(str3,"HELLO3"); D.strcpy(str4,"HELLO4");

12.以下程序的输出结果是( )。

#include"stdio.h"

main()

{ char *p[5]={"ABCD","EF","GHI","JKL","MNOP"};

char **q=p;

int i;

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

}

A.ABCDEFGHIJKL B.ABCD C.ABCDEFGHIJKMNOP D.AEJM

13.若有定义语句“int (*p)[M];”其中标识符 p 表示的是( )。 A.M 个指向整型变量的指针

B.指向 M 个整型变量的函数指针

C.一个指向具有 M 个整型元素的一维数组的指针

D.具有 M 个指针元素的一维数组,每个元素都是指向整型变量的指针

14.若有定义语句“int (*p)();”其中标识符 p 表示的是( )。 A.指向整型变量的指针 B.指向整型函数的指针 C.返回整型指针的函数 D.返回整型变量的函数 15.以下程序段的输出结果是( )。

char *s="abcde";

s+=2;

printf("%s",s);

A.cde B.字符'c'

C.字符'c'的地址 D.无确定的输出结果 16.main()函数中参数表示不合法的是( )。

A.main(int a,char*c[]) B.main(int arc,char **arv) C.main(int arge,char *argv) D.main(int argv,char *argc[]) 17.以下程序的输出结果是( )。

#include"stdio.h"

#include"string.h"

main() {

char arr[2][4];

strcpy(arr[0],"you");

strcpy(arr[1],"me");

arr[0][3]='&';

puts(arr[0]);

}

A.you&me B.you C.me D.err 18.以下程序的输出结果是( )。

#include"stdio.h"

void func(int *a,int b[]){b[0]=*a+6;}

main()

{ int a,b[5];

a=0;

b[0]=3;

func(&a,b);

printf("%d",b[0]);

}

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

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

int fun(int *c);

main(){int (*a)()=fun,*b(),w[10],c;…}

在必要的赋值之后,对 fun()函数正确调用的表达式是( )。

A.a(w) B.(*a)(&c) C.b(w) D.fun(b) 20.以下程序的输出结果是( )。

#include"stdio.h"

void fun(int *a,int *b)

{ int *k;

k=a;a=b;b=k;}

main()

{ int a=3,b=6,*x=&a,*y=&b;

fun(x,y);

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

}

A.6 3 B.3 6 C.编译出错 D.0 0 二、填空题

1.对于变量 x,其在内存中的地址可以写成 (1) ;对于数组 y[10],其首地址可以 写成 (2) 或 (3) ;对于数组元素 y[3],其地址可以写成 (4) 或 (5) 。

2.设有定义语句“int k,*p1=&k,*p2;”,能完成表达式“p2=&k;”功能的表达式可以写成 ________。

3.以下程序的输出结果是________。

#include"stdio.h"

main()

{ int a[5]={2,4,6,8,10},*p,**k;

p=a;

k=&p;

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

printf("%d",**k);

}

4.以下程序的输出结果是________。

#include"stdio.h"

main()

{ int a[3]={2,4,6},*prt,x=8,y,z;

prt=&a[0];

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

z=(*(prt+y)<x)?*(prt+y):x;

printf("%d",z);

}

5.以下程序的输出结果是________。

char s[20]="goodgood",*sp=s;

sp=sp+2;

sp="to";

printf("%s",s);

6.以下程序的输出结果是________。

#include"stdio.h"

main() {

char b[]="ABCDEFG",*chp=&b[7];

while(--chp>=&b[0])

printf("%c",*chp);

}

7.以下程序输出数组 a 中的最大元素,并由指针 s 指向该元素。请填空。

#include"stdio.h"

main() {

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

for(p=a,s=a;p-a<10;p++) if(________) s=p;

printf(%d",*s);

}

8.设有如下定义语句,则表达式“**p2”的值是 (1) ,表达式“*(*p2+1)”的值是 (2) 。

int x[3]={1,2,3},*p1=x,**p2=&p1;

三、编程题

1.设计一个 select()函数,在 N 行 M 列的二维数组中选出一个最大值作为函数的返回值,

并通过形参传回此最大值所在的行下标。

2.设计一个程序,输入一个十进制正整数,输出其对应的十六进制数。

3.设计一个函数,判断一个字符串是否为回文,即顺读和逆读都是一样的字符串,若是,

返回 1;否则返回 0。

4.设计一个函数,模拟字符串比较函数 strcmp(str1,str2)。

5.有 n 个整数,使其前面各数顺序向后移 m 个位置,最后面的 m 个数变成最前面的 m 个数。设计一个 move()函数实现上述功能,在 main()函数中输入 n 个数,并输出调整后的 n 个数。

6.设计一个程序,输入一个字符串,内有数字字符和非数字字符,将其中连续的数字字 符作为一个整数。统计字符串中共有多少个这样的整数,并输出这些数。例如,字符串

"a123x45?6h7890"中共有 4 个所求的整数:123、45、6、7890。

7.设计一个程序,输入 n 为偶数时,调用函数求 1/2+1/4+…+1/n;输入 n 为奇数时,调 用函数求 1/1+1/3+…1/n。要求通过指向函数的指针完成。

相關文件