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。要求通过指向函数的指针完成。