指针练习
1、选择题
1.1、若有下面的变量定义,以下语句中合法的是( )。
int i,a[10],*p;
A)p=a+2; B)p=a[5];
C)p=a[2]+2; D)p=&(i+2);
1.2、有以下程序
main()
{
int a[3][3],*p,i;
p=&a[0][0];
for(i=0;i<9;i++)
p[i]=i;
for(i=0;i<3;i++)
printf("%d ",a[1][i]);
}
程序运行后的输出结果是 ____________
A)0 1 2
B)1 2 3
C)2 3 4
D)3 4 5
1.3、有以下程序
int 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("%2d",a[i][j]);
printf("\n");
}
}
若运行时输入:1 2 3<回车>,则输出结果为 ___________
A)产生错误信息
B)1 0
2 0
0 0
C)1 2
3 0
0 0
D)1 0
2 0
3 0
1.4、有以下程序
main()
{ int a[]={1,2,3,4,5,6,7,8,9,0},*p;
for(p=a;p<a+10;p++)
printf("%d,",*p);
}
程序运行后的输出结果是 __________
A)1,2,3,4,5,6,7,8,9,0,
B)2,3,4,5,6,7,8,9,10,1,
C)0,1,2,3,4,5,6,7,8,9,
D)1,1,1,1,1,1,1,1,1,,1,
1.5、有以下程序
main()
{
char s[]="159",*p;
p=s;
printf("%c",*p++);
printf("%c",*p++);
}
程序运行后的输出结果是________
A)1 5 B)1 6 C)1 2 D)5 9
1.6、有以下程序
point(char *p)
{
p+=3;
}
int main()
{ char b[4]={'a','b','c','d'}, *p=b;
point(p); printf("%c\n",*p);
}
程序运行后的输出结果是 __________
A)a B)b C)c D)d
1.7、设有如下定义语句 int m[ ]={2,4,6,8}, *k=m;
以下选项中,表达式的值为 6的是
A *(k+2) B k+2 C *k+2 D *k+=2
1.8、若有定义语句:int year=2009,*p=&year;,以下不能使变量 year 中的值增至 2010 的语 句是( )。
A)*p+=1; B)( *p)++; C)++(*p); D)*p++;
1.9、设有定义:double x[10],*p=x;,以下能给数组 x 下标为 6 的元素读入数据的正确语句是
A)scanf("%f",&x[6]); B)scanf("%lf",*(x+6));
C)scanf("%lf",p+6); D)scanf("%lf",p[6]);
1.10、若有定义语句:char s[3][10], (*k)[3], *p; ,则以下赋值语句正确的是____
A)p=s; B)p=s[0]; C)p=k; D)k=s;
1.11、有定义语句:int *p[4]; 以下选项中与此语句等价的是
A)int p[4]; B)int **p; C)int *(p[4]); D)int (*p)[4];
1.12、若有定义语句:int a[4][10], *p, *q[4]; 且 0≤i<4,则错误的赋值 是
A)p=a B)q[i]=a[i] C)p=a[i] D)p=&a[2][1]
1.13、若有以下定义
int x[10],*pt=x;
则对 x 数组元素的正确应用是
A)*&x[10] B)*(x+3)
C)*(pt+10) D)pt+3
1.14、有以下程序
#include <stdio.h>
main()
{ int a[ ]={1,2,3,4},y,*p=&a[3];
--p; y=*p; printf(“y=%d\n”,y);
}
程序的运行结果是
A)y=0 B)y=1 C)y=2 D)y=3
1.15、设char *s = “\ta\017bc”;则指针变量s指向的字符串所占的字节数是_______
A) 6 B) 2 C) 5 D) 9
1.16、若有定义语句:char s[3][10], (*k)[3], *p;,则以下赋值语句正确的是
A)p=s; B)p=k; C)p=s[0]; D)k=s;
2、填空题
2.1以下程序的输出结果是 6
#include<stdio.h>
main()
{ int a[5]={2,4,6,8,10}, *p;
p=a+2;
printf(“%d”,*p++);
}
2.2、以下程序段的定义语句中,x[1]的初值是 2 ,程序运行后输出的内容是2 4 6 8
#include<stdio.h>
main()
{ int x[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},*p[4],i;
for(i=0;i<4;i++)
{ p[i]=&x[2*i+1]; printf(“%d ”,p[i][0]);
}
printf(“\n”);
}
2.3 以下程序段的输出结果是(rgb )
#include <sthio.h>
mian()
{ char *ch[4]={“red”,”green”,”blue”}; int i=0;
while(ch[i]);
{ putchar(ch[i][0]; i++; }
}
2.4、以下程序的功能是:借助指针变量找出数组元素中最大值所在的位置并输出该最大值。 请在输出语句中填写代表最大值的输出项。
#include <stdio.h>
int main()
{ int a[10], *p, *s;
for(p=a; p-a<10; p++)
scanf(“%d”, p);
for(p=a,s=a;p-a<10;p++)
if(*p>*s) s=p;
printf(“max=%d, 序号:%d\n” , *s,s-a );
}
2.5 有以下程序,输出结果为2 5
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
2.6 以下程序的功能是:借助指针变量找出数组元素中最大值所在的位置并输出该最大值。 请在输出语句中填写代表最大值的输出项。
#include <stdio.h>
int main( )
{ int a[10], *p, *s;
for(p=a;p-a<10; p++)
scanf(“%d”,p);
for(p=a,s=a;p-a<10;p++)
if(*p>*s) s=p;
printf(“max=%d\n” , *s );
3、编程题
3.1、 有一个整型数组int [10] = {10,20,30,40,50,60,70,80,90,100};标准输入一个整型数值m(0<m<10) ,使前面10-m个数值向后移动m个位置,最后m个数变成前面的m个数
int main(){
int a[10] = {10,20,30,40,50,60,70,80,90,100},m,tmp=0;
scanf("%d",&m);
for(int i=10-m-1;i>=0;i--){
tmp=a[i];
int j;
for(j=0;j<m;j++){
a[i+j]=a[i+j+1];
}
a[i+j]=tmp;
}
for(int i=0;i<10;i++){
printf("%4d",a[i]);
}
return 0;
}