第八章 指 针
1.若int x ,*pb; ,则正确的赋值表达式是
A)pb=&x B)pb=x; C)*pb=&x; D)*pb=*x
2.有如下程序段
int *p ,a=10 ,b=1 ;
p=&a ; a=*p b ;
执行该程序段后,a的值为
A)12 B)11 C)10 D)编译出错
3.若有以下定义和语句:
double r=99 , *p=&r ;
*p=r ;
则以下正确的叙述是
A) 以下两处的*p含义相同,都说明给指针变量p赋值
B) 在"double r=99,*p=&r;"中,把r的地址赋值给了p所指的存储单元
C) 语句"*p=r;"把变量r的值赋给指针变量p
D) 语句"*p=r;"取变量r的值放回r中
4.下列程序的输出结果是
A)4 B)6 C)8 D)10
int b=2;
int func(int *a)
{ b = *a; return(b);}
main()
{ int a=2, res=2;
res = func(&a);
printf("%d \n",res);}
5.下面函数用来求出两个整数之和,并通过形参传回两数相加之和值,请填空。
int add(int x ,int y ,【 】 z)
{ 【 】 =x y; }
6.下面程序的输出是
A)23 B)24 C)25 D)26
void prtv(int * x)
{ printf("%d\n", *x);}
main()
{ int a=25 ;prtv(&a);}
7.下面程序的输出结果是 【 】。
void as( int x ,int y ,int *cp ,int *dp)
{ *cp=x y;*dp=x-y;}
main()
{ int a=4 ,b=3 ,c ,d ;
as(a ,b ,&c ,&d);
printf("%d %d\",c,d);}
8.请选出以下程序的输出结果
#include <stdio.h>
sub(int x ,int y ,int *z)
{ *z=y-x ; }
main()
{ int a , b , c ;
sub(10 ,5 ,&a) ; sub(7 ,a ,&b) ; sub(a ,b ,&c) ;
printf("%d ,%d ,%d\n" ,a ,b ,c) ;}
A) 5 ,2 ,3 B) -5 ,-12 ,-7
C) -5 ,-12 ,-17 D) 5 ,-2 ,-7
9.有以下程序
int fun(int x ,int y ,int *cp ,int *dp)
{ *cp=x y; *dp=x-y; }
main()
{ int a , b , c , d ;
a=30; b=50;
fun(a ,b ,&c ,&d) ;
printf("%d ;%d\n" , c , d) ; }
输出结果是
A)50 ;30 B)30 ;50 C)80 ;-20 D)80 ;20
10.要求函数的功能是交换x和y中的值,且通过正确调用返回交换结果.能正确执行此功能的函数是
A) funa (int *x,int *y) { int *p; *p=*x; *x=*y;*y=*p; }
B) fund (int x,int y) { int t; t=x;x=y;y=t; }
C) func (int *x,int *y) { *x=*y;*y=*x;}
D) fund (int *x,int *y) { *x=*x *y;*y=*x-*y;*x=*x-*y; }
11.若有说明:long *p ,a;则不能通过scanf语句正确给输入项读入数据的程序段是
A) *p=&a; scanf("%ld",p);
B) p=(long *)malloc(8); scanf("%ld",p);
C) scanf("%ld",p=&a);
D) scanf("%ld",&a);
12.以下程序执行后,a的值是
A)4 B)1 C)0 D)运行时出错,无定值
main()
{ int a ,k=4 ,m=6 ,*p1=&k ,*p2=&m ;
a=p1= =&m ;
printf("%d\n",a); }
13.fun1函数的调用语句为:fun1(&a ,&b ,&c) ; 它将三个整数按由大到小的顺序调整后依次放入a ,b ,c ,三个变量中 ,a中放大数。请填空。
void fun2 (int *x ,int *y)
{ int t ;
t=*x ; *x=*y ;*y=t ; }
void fun1 (int *pa ,int *pb ,int *pc)
{ if 【 】 ;
if 【 】 ;
if (*pc>*pb) fun2(【 】) ; }
14.对于类型相同的两个指针变量之间,不能进行的运算是
A)< B)= C) D)-
15.若有以下定义,则不移动指针p,且通过指针p引用值为98的数组元素的表达式是【 】。
int w[10]={23,54,10,33,47,98,72,80,61}, *p=w;
16.若已定义:
int a [ ]={0,1,2,3,4,5,6,7,8,9} ,*p=a ,i ;
其中 0≤i≤9, 则对a数组元素不正确的引用上
A)a[p-a] B)*(&a[i]) C)p[i] D)a[10]
17.若已定义:int a[9] ,*p=a;并在以后的语句中未改变p的值,不能表示a[1] 地址的表达式是
A)p 1 B)a 1 C)a D) p
18.若有以下说明:
int a[10]={1,2,3,4,5,6,7,8,9,10} ,*p=a ;
则数值为6的表达式是
A)*p 6 B)*(p 6) C)*p =5 D)p 5
19.设P1和P2是指向同一个int型一维数组的指针变量,k为int型变量,则不能正确执行的语句是
A)k=*P1 *P2; B)p2=k; C)P1=P2; D)k=*P1 * (*P2);
20.下面程序的输出是
A)3 B)4 C)1 D)2
main()
{ int a[10]={ 1,2,3,4,5,6,7,8,9,10} ,*p=a 1;
printf("%d\n",*(p 2));
}
21.若有以下的定义:
int a[ ]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} , *p=a ;
则值为3的表式是
A)p =2 , *(p ) B)p =2 ,* p
C)p =3 , *p D)p =2 , *p
22.若有以下定义和语句:
int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ,*p=a ;
则不能表示a数组元素的表达式是
A)*p B)a[10] C)*a D)a[p-a]
23.阅读程序:
main()
{ int a[10]={1,2,3,4,5,6,7,8,9,0},*p;
p=a;
printf("%x\n",p);
printf("%x\n",p 9); }
该程序有两个printf 语句, 如果第一个printf 语句输出的是194, 则第二个printf语句的输出结果是
A)203 B)204 C)1a4 D)1a6
24.请选出正确的程序段
A) int *p; B) int *s, k;
scanf("%d",p); *s=100;
… …
C) int *s, k; D) int *s, k;
char *p, c; char *p, e;
s=&k; s=&k;
p=&c; p=&c;
*p='a'; s=p;
… *s=1;
…
25.有如下说明
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9的表达式是
A)*p 9 B)*(p 8) C)*p =9 D)p 8
26.已知指针p的指向如下图所示,则执行语句 *--p;后*p的值是
A) 30 B)20 C)19 D)29
a[0] a[1] a[2] a[3] a[4]
10 |
20 |
30 |
40 |
50 |
↑
p
27.执行以下程序后,y的值是
main( )
{ int a[ ]={2,4,6,8,10};
int y=1,x,*p;
p=&a[1];
for(x=0;x<3;x )
y = * (p x);
printf("%d\n",y);}
A)17 B)18 C)19 D)20
28.设有如下定义:
int arr[]={6 ,8 ,9 ,10};
int * ptr;
则下列程序段的输出结果为
ptr=arr ;
*(ptr 2) =2 ;
printf ("%d ;%d\n" ,*ptr ,*(ptr 2));
A)8 ;10 B)6 ;8 C)7 ;9 D)6 ;10
29.下列程序执行后的输出结果是
A)6 B)7 C)8 D)9
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 \n",b[0]);}
30.下面程序把数组元素中的最大值放入a[0]中。则在if 语句中的条件表达式应该是
A)p>a B)*p>a[0] C)*p>*a[0] D)*p[0]> *a[0]
main( )
{ int a[10]={6,7,2,9,1,10,5,8,4,3},*p=a,i;
for(i=0;i <10;i ,p )
if(【 】) *a=*p;
printf("%d",*a); }
31.以下函数返回a所指数组中最小的值所在的下标值
fun(int *a , int n)
{ int i ,j=0 ,p ;
p=j ;
for(i=j ;i<n ;i )
if(a[i]<a[p])【 】
return(p); }
在下划线处应填入的是
A)i=p B)a[p]=a[i] C)p=j D)p=i
32.以下程序的运行结果是
A)运行后报错 B)6 6 C)6 12 D)5 5
#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 \n",*p,*q); }
33.要求函数的功能是在一维数组a中查找x值;若找到则返回所在的下标值,否则返回0;数列放在a[1]到a[n]中。不能正确执行此功能的函数是
A) funa(int *a ,int n ,int x)
{ *a=x; while(a[n]!=x)n--; return n; }
B) funb(int *a ,int n ,int x)
{ int k;for(k=1;k<=n;k )
if(a[k]==x)return k; return 0;}
C) func(int a[ ] ,int n ,int x)
{ int *k; a[0]=x;k=a n;while(*k!=x)k--; return k-n; }
D) fund (int a[] ,int n ,int x)
{ int k=0;do{ k ;} while ((k<n 1)&&(A[k]!=x));}
34.下面程序输出数组中的最大值,由s指针指向该元素.
main()
{ int a[10]={6,7,2,9,1,10,5,8,4,3,},*p,*s;
for(p=a, s=a; p-a<10; p )
if(【 】)s=p;
printf("The max:%d",*s): }
则在if语句中的判断表达式应该是
A)p>s B)*p>*s C)a[p]>a[s] D)p-a>p-s
35.若有以下定义和语句:
int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ,*p=a ;
则不能表示a数组元素的表达式是
A)*p B)a[10] C)*a D)a[p-a]
36.若有以下调用语句,则不正确的fun函数的首部是
A) void fun(int m, int x[]) B) void fun(int s, int h[41])
C) void fun(int p, int *s) D) void fun(int n, int a)
main()
{ …
int a[50],n;
…
fun(n, &a[9]);
… }