指针习题及答案
一.选择题
1.变量的指针,其含义是指该变量的
A)值
2.已有定义 int k=2;int *ptr1,*ptr2;且 ptr1 和 ptr2 均已指向变量 k,下面不能正确执行
的赋值语句是
A)k=*ptr1+*ptr2
3.若有说明:int *p,m=5,n;以下程序段正确的是
A)p=&n ;
C)ptr1=ptr2
D
B)p = &n ;
D)k=*ptr1*(*ptr2)
D)一个标志
B)ptr2=k
B)地址
C)名
。
。
。
B
B
scanf(“%d”,&p);
C)scanf(“%d”,&n);
*p=n ;
scanf(“%d”,*p);
D)p = &n ;
*p = m ;
4.已有变量定义和函数调用语句:int a=25;print_value(&a);下面函数的输出结果是
D
。
void print_value(int *x)
{
printf(“%d\n”,++*x); }
B)p1=&m; p2=&n; *p1=*p2 ;
D)p1=&m; *p1=*p2 ;
B)24
C)25
A)23
5.若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是
A)p1=&m; p2=&p1 ;
C)p1=&m; p2=p1 ;
6.若有语句:int *p,a=4;和 p=&a;下面均代表地址的一组选项是
A)a,p,*&a
7.下面判断正确的是
A)char *a=”china”; 等价于 char *a; *a=”china” ;
B)char str[10]={“china”}; 等价于 char str[10]; str[ ]={“china”;}
C)char *s=”china”; 等价于 char *s; s=”china” ;
D)char c[4]=”abc”,d[4]=”abc”; 等价于 char c[4]=d[4]=”abc” ;
8.下面程序段中,for 循环的执行次数是
。
C)*&p,*p,&a
B)&*a,&a,*p
。
C
C
D)26
C
。
D
。
D)&a,&*p,p
char *s=”\ta\018bc” ;
for (
; *s!=’\0’ ; s++)
printf(“*”) ;
B)7
A)9
9.下面能正确进行字符串赋值操作的是
A)char s[5]={“ABCDE”};
C)char *s ; s=”ABCDE” ;
10.下面程序段的运行结果是
C
char *s=”abcde” ;
s+=2 ; printf(“%d”,s);
C)6
C
。
D)5
B)char s[5]={‘A’,’B’,’C’,’D’,’E’};
D)char *s; scanf(“%s”,s) ;
。
B
B)字符’c’
C)字符’c’的地址
A)cde
11.设 p1 和 p2 是指向同一个字符串的指针变量,c 为字符变量,则以下不能正确执行的赋
值语句是
A)c=*p1+*p2
12.设有程序段:char s[ ]=”china”; char *p ; p=s ;则下面叙述正确的是
A)s 和 p 完全相同
B)数组 s 中的内容和指针变量 p 中的内容相等
D)c=*p1*(*p2)
。
D)不确定
C)p1=p2
B)p2=c
。
D
C)s 数组长度和 p 所指向的字符串长度相等
D)*p 与 s[0]相等
13.以下与库函数 strcpy(char *p1,char *p2)功能不相等的程序段是
A)strcpy1(char *p1,char *p2)
D
。
{ while ((*p1++=*p2++)!=’\0’) ; }
B)strcpy2(char *p1,char *p2)
{ while ((*p1=*p2)!=’\0’) { p1++; p2++ } }
C)strcpy3(char *p1,char *p2)
{ while (*p1++=*p2++) ; }
D)strcpy4(char *p1,char *p2)
{ while (*p2) *p1++=*p2++ ; }
14.下面程序段的运行结果是
char a[ ]=”language” , *p ;
p=a ;
while (*p!=’u’) { printf(“%c”,*p-32); p++ ; }
C
。
B)language
A)LANGUAGE
16.以下与库函数 strcmp(char *s,char *t)功能相等的程序段是
A)strcmp1(char *s,char *t)
for ( ; *s++=*t++; )
C)LANG
{
D)langUAGE
C
。
if (*s= =’\0’) return 0 ;
return (*s-*t) ;
}
B)strcmp2(char *s,char *t)
for ( ; *s++=*t++; )
if (!*s) return 0 ;
{
return (*s-*t) ;
}
C)strcmp3(char *s,char *t)
{
for ( ; *t= =*s; )
{ if (!*t) return 0 ; t++ ; s++ ; }
return (*s-*t) ;
}
D)strcmp4(char *s,char *t)
{
for ( ; *s==*t; s++, t++ )
if (!*s) return 0 ;
return (*t-*s) ;
}
D
。
17.以下说明不正确的是
A)char a[10]=”china” ;
C)char *a; a=”china” ;
18.设有说明语句:char a[]=”It is mine”;char *p=”It is mine”;则以下不正确的叙
述是
A)a+1 表示的是字符 t 的地址
B)p 指向另外的字符串时,字符串的长度不受限制
B)char a[10],*p=a; p=”china”;
D)char a[10],*p; p=a=”china”;
。
D
B)*a+1
C)&a+1
C)*(a+j)
B)(a+i)
B)p[2]
B)s++
B)a+2
C)*(p+5)
C)p[1]+1
D
。
B)(a+i)[j]
C)*(a+i+j)
B)*(*(p+2)+1)
B
D)&s[1]
C)p 变量中存放的地址值可以改变
D)a 中只能存放 10 个字符
19.若已定义 char s[10];则在下面表达式中不表示 s[1]的地址是
C)&s[0]+1
A)s+1
20.若有定义:int a[5],*p=a;则对 a 数组元素的正确引用是
A)*&a[5]
21.若有定义:int a[5],*p=a;则对 a 数组元素地址的正确引用是
A)p+5
22.若有定义:int a[2][3];则对 a 数组的第 i 行第 j 列元素值的正确引用是
A)*(*(a+i)+j)
23.若有定义:int a[2][3];则对 a 数组的第 i 行第 j 列元素地址的正确引用是 D
A)*(a[i]+j)
D)a[i]+j
24.若有程序段:int a[2][3],(*p)[3]; p=a;则对 a 数组元素地址的正确引用是
A)*(p+2)
25.若有程序段:int a[2][3],(*p)[3]; p=a;则对 a 数组元素的正确引用是
A)(p+1)[0]
C)*(p[1]+1)
26.若有定义:int a[5];则 a 数组中首元素的地址可以表示为
A)&a
27.若有定义:int (*p)[4];则标识符 p
A)是一个指向整型变量的指针
B)是一个指针数组名
C)是一个指针,它指向一个含有四个整型元素的一维数组
D)定义不合法
28.以下与 int *q[5];等价的定义语句是
A)int q[5]
29.以下正确的说明语句是
A)int *b[]={1,3,5,7,9} ;
B)int a[5],*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
C)int a[]={1,3,5,7,9}; int *num[5]={a[0],a[1],a[2],a[3],a[4]};
D)int a[3][4],(*num)[4]; num[1]=&a[1][3];
30.若有定义:int b[4][6],*p,*q[4];且 0≤i<4,则不正确的赋值语句是
A)q[i]=b[i];
32.若要对 a 进行自减运算,则 a 应有下面说明
A)int p[3];
int *a=p;
C
C)int *(q[5])
B)int *q
B
C)char *a[3]
C)p=b[i];
B)int k;
int *a=&k;
C)a
C
。
D
。
B)p=b;
B)a+1
D)(p+1)+2
C
D)p[1]+2
C
。
D)&a[1]
。
D)int (*q)[5]
。
。
D)*(a+2)
D
。
D)&a[0]
A
D)*(a+i)+j
。
。
。
。
D
。
D)q[i]=&b[0][0]
D)int b[10];
int *a=b+1;
33.以下选项中,对指针变量 p 的正确操作是
A)int a[3], *p;
B)int a[5], *p;
B
。
C)int a[5];
p=&a;
p=a;
int *p=a=100;
D)int a[5]
int *p1,*p2=a;
*p1=*p2;
34.若有定义:int x[10]={0,1,2,3,4,5,6,7,8,9},*p1;则数值不为 3 的表达式是 C
A)x[3]
C)p1=x+2,*(p1++)
35.下面程序段的输出是
B)p1=x+3,*p1++
D)p1=x+2,*++p1
。
C
。
int a[ ]={2,4,6,8,10,12,14,16,18,20,22,24},*q[4],k;
for (k=01; k<4; k++) q[k]=&a[k*3];
printf(“%d\n”,q[3][0]);
B)16
D
C)20
D)输出不合法
A)8
36.若要对 a 进行自增运算,则 a 应具有下面说明
A)int a[3][2];
C)char (*a) [3]
37.若有定义 int a[4][6];则能正确表示 a 数组中任一元素 a[i][j](i,j 均在有效范围内)
地址的表达式
A)&a[0][0]+6*i+j
C)&a[0][0]+4*i+j
38.下面程序的运行结果是
B)char *a[ ]={“12”,”ab”};
D)int b[10], *a=b;
B)&a[0][0]+4*j+i
D)&a[0][0]+6*j+I
。
。
。
A
B
main ( )
{
int x[5]={2,4,6,8,10}, *p, **pp ;
p=x , pp = &p ;
printf(“%d”,*(p++));
printf(“%3d”,**pp);
}
4
D
。
。
B
。
D)4
6
B)2
4
C)2
2
B)一个地址
C)一个字符串
D)一个不定值
B)(*p+1)+2
D)*(*(p+1)+2)
A)4
39.若有定义 int x[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[3]=x ; 则能够正确表示数组元素
x[1][2]的表达式是
A)*((*p+1)[2])
C)*(*(p+5))
40.若有说明:char *language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};则
language[2]的值是
A)一个字符
41.设有定义:char *cc[2]={“1234”,”5678”};则正确的叙述是 A
A)cc 数组的两个元素中各自存放了字符串”1234”和”5678”的首地址
B)cc 数组的两个元素分别存放的是含有 4 个字符的一维字符数组的首地址
C)cc 是指针变量,它指向含有两个数组元素的字符型一维数组
D)cc 元素的值分别维”1234”和”5678”
42.已有定义 int (*p)( );指针 p 可以
A)代表函数的返回值
C)表示函数的类型
43.已有函数 max(a,b),为了让函数指针变量 p 指向函数 max,正确的赋值方法是 A 。
A)p=max;
44.若有函数 max(a,b),并且已使函数指针变量 p 指向函数 max,当调用该函数时,正确的
调用方法是
A)(*p)max(a,b)
45.以下正确的叙述是
A)C 语言允许 main 函数带形参,且形参个数和形参名均可由用户指定
B)C 语言允许 main 函数带形参,形参名只能是 argc 和 argv
C)当 main 函数带有形参时,传给形参的值只能从命令行中得到
D)若有说明: int main(int argc,char **argv),则 argc 的值必须大于 1
B)指向函数的入口地址
D)表示函数返回值的类型
D)*p=max(a,b);
B)p=max(a,b);
B)*pmax(a,b);
C 或 p(a,b)
C)(*p)(a,b);
C)*p=max;
D )*p(a,b);
C
。
B
。
。
三.程序阅读题
1.写出下面程序的运行结果。 5
func(char *s,char a,int n)
{
int j;
*s=a; j=n ;
while (*s
*(a--)=*(a-1);
*(a--)=b;
}
main ( )
{
char s[]=”97531”,c;
c = getchar ( ) ;
sub(s,c); puts(s) ;
}
5.写出下面程序的运行结果。
Java
dBase
C Language
Pascal
main ( )
{
char *a[]={“Pascal”,”C Language”,”dBase”,”Java”};
char (**p)[ ] ; int j ;
p = a + 3 ;
for (j=3; j>=0; j--)
printf(“%s\n”,*(p--)) ;
}
四.程序填空题
1.下面函数的功能是从输入的十个字符串中找出最长的那个串,请填(2)空使程序完整。
void fun(char str[10][81],char **sp)
{
int i;
*sp = 【1
for (i=1; i<10; i++)
str[0]
】;
if (strlen (*sp)
{
int i,j,k,num=0;
for ( i=0; 【1
for (【2
str[i]!=’\0’
j=i
if (substr [【3
k
num++ ; break ;
}
return (num) ;
}
】; i++)
】, k=0; substr[k]= =str[j]; k++; j++)
】]= =’\0’) {
6.下面函数的功能是将两个字符串 s1 和 s2 连接起来,请填(2)空使程序完整。
void conj(char *s1,char *s2)
{
while (*s1) 【1
while (*s2) { *s1=【2
*s1=’\0’ ;
}
s1++
*s2
】;
】; s1++,s2++; }
五.编程题
1.定义 3 个整数及整数指针,仅用指针方法按由小到大的顺序输出。
2.输入 10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三
个函数:①输入 10 个数;②进行处理;③输出 10 个数。所有函数的参数均用指针。
3.编写一个求字符串的函数(参数用指针),在主函数中输入字符串,并输出其长度。
4.编写一个函数(参数用指针)将一个 3×3 矩阵转置。
5.写函数原型为 int strcmp(char *s1,char *s2);的函数,该函数实现两个字符串的比较
(函数功能描述参见教材 P137,strcmp 字符串处理函数)。
6.利用指向行的指针变量求 5×3 数组各行元素之和。