资源描述
第7章 指针
一、选择题
1.以下程序的输出结果是()
main(){
int a[]={1,2,3,4,5,6},*p;
p=a;
printf(“%d,%d\n”,*p,*(p+4));
}
A. 0,5 B.1,5 C.0,6 D.1,6
2.下列哪一项是不正确的字符串赋值或不正确的赋初值的方式?()
A. char *str;str=“string“; B.char str[7]={’s’, ’t’, ’r’, ’i’, ’n’, ’g’ };
C. char str1[10];str1= “string“; D.char str1[]=“string“,*str2=”1234567”;
3.对于类型相同的指针变量,不能进行()运算。
A. + B. - C. = D.==
4.已知p是一个整型指针变量,a为一个一维整型数组,且p=a;则下列哪个语句是错误的?()
A.*p=a[0]; B. *p=*a; C. P=a+1; D.p=*a;
5.若有以下说明语句,则p2-p1的值为()
int a[10],*p1,*p2;
p1=a;
p2=&a[5];
A. 5 B. 6 C. 10 D.没有指针与指针的减法
6.下列定义中不正确的是()
A.int *p; B. int p[10];
C.int (*p)() D.int *(p(n));
二、写出程序的输出结果
1.main(){
int a=10,b=20,s,t,m,*pa,*pb;
pa=&a;
pb=&b;
s=*pa+*pb;
t=*pa-*pb;
m=*pa**pb;
printf“s=%d\nt=%d\nm=%d\n“,s,t,m);
}
2.
main(){
int a[][3]={9,7,5,3,1,2,4,6,8};
int i,j,s1=0,s2=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{if (i==j) s1=s1+a[i][j];
if(i+j==2) s2=s2+a[i][j];
}
printf(“%d\n%d\n”,s1,s2);
}
3.
main(){
int a[5]={1,3,5,7,9},*p,**k;
p=a;k=&p;
printf(“%d”,*(p+2));
printf(“%d”,**k);
}
4.
main(){
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i=2,j=2;
p=a;
printf(“%d”,*(*(p+i)+j)+*(*(a+i)+j)+**(p+i)+**p);
}
三、填空
1. 在空格地方填上语句,以实现字符串复制的功能。
main(){
char *ps=“C language“;
char str[15];
char *p1,*p2;
p1=ps;
p2=str;
while(*p1!=’\0’)
{
(1)
(2)
(3)
}
*p2=’\0’;
printf(“ps=%s\n”,ps);
printf(“str=%s\n”,str);
}
2.下面程序完成从键盘输入两个字符串a和b,再将a和b的对应位置字符中的较大者存放在数组c中,填空完成该程序。
main(){
int k=0;
char a[80],b[80],c[80]={‘\0’},*p,*q;
p=a;q=b;
gets(a);
gets(b);
while( (1) )
{ if ( (2) ) c[k]=*p;
else c[k]=*q;
p++;
(3)
k++;
}
if(*p!=0) strcat(c,p);
else strcat(c,q);
puts(c);
}
3.完成下面程序,以实现单词的输出功能。
main(){
char *s[]={“man”,”woman”,”girl”,”boy”,”sister”};
char **q;
int k;
for(k=0;k<5;k++)
{ (1) ;
printf(“%s\n”,*q);
}
}
4.下列程序完成截取字符串s中从第m个位置开始的n个字符,返回所截字符串的首地址。
static char sub[20];
main(){
int m,n;
static char s[]=”good moring”;
char *cut(char *s1,int m1,int n1),*p;
scanf(“%d%d”,&m,&n);
p=cut(s,m,n);
printf(%s\n”,p);
}
char *cut(char *s1,int m1,int n1)
{int k;
for(k=0;k<n1;k++)
sub[k]= (1) ;
sub[k]=’\0’;
return (2) ;
}
;
5.下列程序求数组元素的平均值。
float f(int *p,int n)
{int i;
float avg=0.0;
for(i=0;i<n;i++)
avg+=*p++;
(1) ;
return avg;
}
main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
float avg;
avg=f( (2) ,10);
printf(“\n Average=%f\n”,avg);
}
6.下列程序完成3个操作。(1)输入10个字符串(每串不多于9个字符),依次放在a数组中,指针数组str中的每个元素依次指向每个字符串的开始。(2)输入每个字符串。(3)从这些字符串中选出最小的那个串输出。
main(){
char a[100],*str[10],*sp;
int i,k;
sp=a;
for(i=0;i<10;i++)
{scanf(“%s”,sp);
str[i]= ;
k=strlen(sp);
sp+= ;
}
k=0;
for(i=0;i<10;i++)
if (strcmp(str[i],str[k]) ) k=i;
;
}
7.下面程序把数组元素按相反的顺序进行存放。
void inv(int *x,int n)
{ int *i,*j,t;
for(i=x,j=x+n-1; (1) ;i++,j--)
{t=*i;*i=*j;*j=t;}
}
main(){
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf(“The old array is:\n”);
for(i=0;i<10;i++)
printf(“%-6d”,a[i]);
printf(“\n”);
(2) ;
printf(“after reveser:\n”);
for(i=0;i<10;i++)
printf(“%-6d”,a[i]);
printf(“\n”);
}
8.用指针法求出数组中的最大元素与最小元素。
int max,min;
void max_min_value(int array[],int n){
int *p;
(1) ;
for( (2) ;p<array+n;p++)
if(*p>max)
max=*p;
else
if (*p<min)
min=*p;
}
main(){
int i,number[10],*p;
p=number;
printf(“input 10 number:\n”);
for(i=0;i<10;i++,p++)
scanf(“%d”,p);
(3) ;
max_min_value(p,10);
printf(“max=%10d min=%d\n”,max,min);
}
9.把字符串按从小到大的顺序输出。
void sort( (1) ,int n){
int i,j,k;
char *temp;
for(i=0;i<=n-1;i++)
{ k=i;
for(j=i+1;j<=n;j++)
if ( (2) ) k=j;
if(k!=i) {temp=name[i];name[i]=name[k];name[k]=temp;}
}
}
void print(char *name[],int n){
int i;
for(i=0;i<n;i++)
printf(“%s\n”, (3) );
}
main(){
char *name[]={“Nanhua”,”Central South”,”HuNan”,”HuBei”};
sort(name,4);
print(name,4);
}
四、编程题
1.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数)凡报到3的人退出圈子,问最后留下的那位是原来的第几号。
2.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少?
3.输入一个字符串,内有数字和非数字字符,如:a123x456=4567?45at587将其中连续的数字作为一个整数,依次存放到数组a中。例如:123存放在a[0],456存放在a[1]……统计共有多少个整数,并输出这些数。
展开阅读全文