第6章 习 题
1. 若已定义int a = 8,*p = &a;则下列说法中不正确的是( )。
A. *p = a = 8 答:
D
B. *p
C. p
D. *&p
2. 若变量已正确定义并且指针p已经指向变量x,则&*p相当于( )。 A. x 答:
C
3. 若已定义int a[8] = {2,4,6,8,10,12,14,16};*p = a;则数组第2个元素”4”不可以表示为( )。
A. a[1] B. p[1] C. *p+1 D.*(p+1) 答:
4. 指向一个包含3个整型元素的一维数组的指针变量的定义形式为( )。 A.int (*p)[] 答:
5. 请任意输入10个整数,使用冒泡法排序方式将它们按从大到小的顺序输出。 答:
#define N 10 #include
int i,j;
int a[N],iTemp,*p; p = a;
printf(”\\nInput %d numbers:\\n”,N); for(i = 0;i < N;i++)
scanf(”%d”,p+i); for(j = 0;j < N-i;j++)
if(*(p+j)<*(p+j+1))
{
iTemp = *(p+j);
*(p+j) = *(p+j+1);
for(i = 0;i < N-1;i++) D
B.int *p[] C.int (*p[])
D.int (*p)[3]
C
B. p = &a
C. *&a = *p
D. *&a = &*a
}
}
*(p+j+1) = iTemp;
printf(”the sorted numbers are:\\n”); printf(”]”,*(p+i));
for(i = 0;i < N;i++) return 0;
6. 有一个二维数组a[3][4],其第3行第4列元素a[2][3]的正确表示方法为( )。 A.&a[2][3] 答: D
7. 以下语句或语句组中,正确的操作是( )。
A. char s[4] = ”abcde”; 答:
8. 阅读下列程序,写出程序运行的结果。
char s[] = ”ABC”; int main() {
} 答:
AABCBBCCC
9. 利用指针完成两个字符串的比较函数strcompare(),模拟完成系统函数strcmp()的功能。 答:
int strcompare(s1,s2)
{
int i,j;
for(i=0;s1[i]||s2[i]);i++)
if(s1[i]!=s2[i]&&s1[i]>s2[i])
return 1; return -1;
else if(s1[i]!=s2[i]&&s1[i] for(p = s;p printf(”%c%s”,*p,p); return 0; B和C B. char *s; gets(s); D. char s[5]; scanf(”%s”,&s); C. char *s; s = ”abcde”; B.a[2]+3 C.*(a+2)+3 D.*(a[2]+3) } return 0; 10. 设计一个反转字符串的函数reverse:void reverse(char *s); 它能将字符串的字符顺序反向重新排列。 答: void reverse(char *s) /*使用中间变量*/ { int len; int i; len = strlen(s)-1; char cTemp; for(i = 0; i < len-i; i++) { cTemp = s[i]; s[i] = s[len-i]; s[len-i] = cTemp; } ch[len+1] = 0; } 11. 阅读下列程序,写出程序运行的结果。 int main() { } 答: 11 12. 使用指针数组编写一个通用的英文月份名显示函数void display(int month)。 答: #include char *p,str[12][6] ={”Jan”,”Feb”,”March”,”Apr”,”May”,”June”, ”July”,”Aug”,”Sep”,”Oct”,”Nov”,”Dec”}; int a[12] = {1,3,5,7,9,11,13,15,17,19,21,23},*p[4],i; for(i = 0;i<4;i++) p[i] = &a[i*3]; printf(”%d\\n”,p[1][2]); return 0; } int month; scanf(”%d”,&month); p = str[month-1]; if(month <= 12&&month>0) printf(”The Month is:%s\\n”,p); printf(”Error!\\n”); else 13. 请利用指针数组设计一个菜单管理程序,当输入字符串“save”、“open”、“quit”时,分别调用其处理函数,完成不同的工作。各处理函数的具体工作可以自行设定,比如可以仅仅显示出不同操作的提示等。 答: #include char *p[3]={”save”,”open”,”quit”}; char *s; int i; printf(”input a string:\\n”); gets(s); for(i=0;i<3;i++) if(strcmp(s,p[i])==0) f(i); return 0; } f(int n) { switch(n) { case 0: printf(”this is save function!\\n”);break; case 1: printf(”this is open function!\\n”);break; case 2: printf(”this is quit function!\\n”);break; } } 14. 程序中对fun()函数有如下说明: void *fun(); 此说明的含义是( )。 A.fun()函数无返回值 B.fun()函数的返回值可以是任意的数据类型 C.fun()函数的返回值是无值型的指针类型 D.指针fun()指向一个函数,该函数无返回值 答: 15. 若有以下定义,int **pp,*p,a = 10,b = 20; 则下列程序段的输出结果是( )。 pp = &p; p = &a; p = &b; printf(”%d,%d\\n”,*p,**pp); A.10,20 答: D 16. 编写一个程序,通过指向指针的指针输出5个字符串。 答: #include int i,n=5; char *cName[]={”Pascal”,”BASIC”,”C”,”FORTRAN”,”Computer design”}; char **p= cName; for(i=0;i printf(”%s\\n”,*(p+i)); return 0; } 思考题 有30个人围成一圈,顺序排号。从第一个人开始报数(从1到4报数),凡是报到4的人退出圈子,最后留下的是原来的第几号。 答: #include int i,k,m,n,num[30],*p; printf(”\\nInput number:\\n”); scanf(”%d”,&n); p = num; for(i = 0;i B.10,10 C.20,10 D.20,20 C