1、第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.c
2、har 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.下列定义中不正确的是()
3、 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++)
4、 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=
5、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”,p
6、s); 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,
7、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
8、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 9、 n)
{int i;
float avg=0.0;
for(i=0;i 10、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.下面程序把数组元素按相反的顺 11、序进行存放。
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 12、);
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 13、],*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+ 14、)
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






