指针一.填空题(20分)
1. 指针变量是把内存中另一个数据的地址作为其值的变量。
2. 能够直接赋值给指针变量的整数是 0。
3. 如果程序中已有定义:int k;
1)定义一个指向变量k的指针变量p的语句是 int* p = &k; 。
2)通过指针变量,将数值6赋值给k的语句是 *p = 6; 。
3)定义一个可以指向指针变量p的变量pp的语句是 int ** pp; 。
4)通过赋值语句将pp指向指针变量p的语句是 pp = &p; 。
5)通过指向指针的变量pp,将k的值增加一倍的语句是 *(*pp)*= 2; 。
4. 当定义某函数时,有一个形参被说明成int *类型,那么可以与之结
合的实参类型可以是int型指针、 int型数组等。
4. 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。45*8
#include
main( )
{ char *p,s[6]; int n; p=s; gets(p); n=*p-'0';
while( *++p != '\0') //先++ ,后*
n=n*8+*p-'0';
printf("%d \n",n);
}
二.选择题(22分)
1. 以下count函数的功能是统计substr在母串str中出现的次数。
int count(char *str,char *substr)
{ int i,j,k,num=0;
for(i=0; ①B ;i++)
{for( ②B ,k=0;substr[k]==str[j];k++,j++)
if(substr[ ③C ]==?\0?)
{num++;break;}
}
return num;
}
①A) str[i]==substr[i] B) str[i]!= 0
C) str[i]==…\0? D) str[i]>substr[i]
②A) j=i+1 B) j=i C) j=i+10 D) j=1
③A) k B) k++ C) k+1 D) ++k
2. 以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。
void Delblank(char *s)
{ int i,t;
char c[80];
for(i=0,t=0; A ①;i++)
if(!isspace( D②))c[t++]=s[i];
c[t]=…\0?;
strcpy(s,c);
}
①A) s[i] B) !s[i] C) s[i]=...\0? D) s[i]== 0
②A) s+i B) *c[i] C) *(s+i)=…\0? D) *(s+i)
3. 以下conj函数的功能是将两个字符串s和t连接起来。
char *conj(char *s,char *t)
{ char *p=s;
while(*s) ①B ;
while(*t)
{*s= A ②;s++;t++;}
*s=…\0?;
C ③;
}
①A) s-- B) s++ C) s D) *s
②A) *t B) t C) t-- D) *t++
③A) return s B) return t C) return p D) return p-t
4. 下列程序的输出结果是 B 。
#include
main()
{int **k,*a,b=100;a=&b; k=&a;printf(“%d\n”,**k);}
A)运行出错 B) 100 C) a的地址 D) b的地址
5. 下列程序的输出结果是 D 。
#include
fun(int *a,int *b)
{int *w;
*a=*a+*a;
*w=*a;
*a=*b;
*b=*w;}
main()
{int x=9,y=5,*px=&x,*py=&y;fun(px,py);printf(“%d, %d\n”,x,y);}
A)出错B) 18, 5 C) 5, 9 D) 5, 18
6. 若定义了以下函数:
void f(……)
{……
p=(double *)malloc(10*sizeof(double));
……
}
p是该函数的形参,要求通过p把动态分配存储单元的地址传回主调函数,则形参p的正确定义应当是 A 。
A) double *p B) float **p C) double **p D) float *p 三.编程题
2. 编写函数实现,计算一个字符在一个字符串中出现的次数。(20分)
#include
#include
3. 有n个人围成一圈,顺序排号。由用户从键盘输入报数的起始位置,从该人开始报数(计数从0开始),凡报数为3的倍数出圈。问最后剩下的是几号?(28