练习7-1答案
选择题
1.已知:int *p, a;,则语句“p=&a;”中的运算符“&”的含义是( D )。
A.位与运算 B.逻辑与运算 C.取指针内容 D.取变量地址
2.已知:int a, x;,则正确的赋值语句是( C )。
A.a=(a[1]+a[2])/2; B.a*=*a+1; C.a=(x=1, x++, x+2); D.a=\"good\";
3.已知:int a, *p=&a;,则下列函数调用中错误的是( D )。
A.scanf(\"%d\B.scanf(\"%d\C.printf(\"%d\D.scanf(\"%d\
4.已知:char *p, *q;,选择正确的语句( C )。
A.p*=3; B.p/=q; C.p+=3; D.p+=q;
5.已知:int x;,则下面的说明指针变量pb的语句( C )是正确的。
A.int pb=&x; B.int *pb=x; C.int *pb=&x; D.*pb=*x;
- 1 -
练习7-2答案
一、选择题
1.设有说明int (*ptr)[M];,其中的标识符ptr是( C )。
A.M个指向整型变量的指针
B.指向M个整型变量的函数指针
C.一个指向具有M列的二维数组的一行的指针
D.具有M个指针元素的一维数组的指针
2.已知:double *p[6];,它的含义是( C )。
A.p是指向double型变量的指针 B.p是double型数组
C.p是指针数组 D.p是数组指针
3.已知:char s[10], *p=s,则在下列语句中,错误的语句是( B )。
A.p=s+5; B.s=p+s; C.s[2]=p[4]; D.*p=s[0];
- 2 -
4.已知:char s[100]; int i;,则在下列引用数组元素的语句中,错误的表示形式是( D )。
A.s[i+10] B.*(s+i) C.*(i+s) D.*((s++)+i)
5.已知:char b[5], *p=b;,则正确的赋值语句是( C )。
A.b=\"abcd\"; B.*b=\"abcd\"; C.p=\"abcd\"; D.*p=\"abcd\";
6.下列对字符串的定义中,错误的是( A )。
A.char str[7]=\"FORTRAN\"; B.char str[]=\"FORTRAN\";
C.char *str=\"FORTRAN\"; D.char str[]={'F', 'O', 'R', 'T', 'R','A','N',0};
7.已知:char s[20]=\"programming\,则不能引用字母o的表达式是( A )。
A.ps+2 B.s[2] C.ps[2] D.ps+=2,*ps
8.已知:char **s;,正确的语句是( B )。
A.s=\"computer\"; B.*s=\"computer\"; C.**s=\"computer\"; D.*s='A';
9.已知:char c[8]=\"beijing\,则下面的输出语句中,错误的是( B )。
- 3 -
A.printf(\"%s\\n\ B.printf(\"%s\\n\
C.for (i=0; i<7; i++) D.for(i=0; i<7; i++)
printf(\"%c\ printf(\"%c\
10.已知:char *aa[2]={\"abcd\,则以下说法正确的是( D )。
A.aa数组元素的值分别是\"abcd\"序列和\"ABCD\"序列
B.aa是指针变量,它指向含有两个数组元素的字符型一维数组
C.aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
D.aa数组的两个元素中各自存放了字符'a'和'A'的地址
11.已知:int a[3][4], *p=&a[0][0]; p+=6;,那么*p和( D )的值相同。
A.*(a+6) B.*(&a[0]+6) C.*a[1]+2 D.a[1][2]
12.已知:int a[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p=a;,则值为3的表达式是( A )。A.p+=2, *(p++) B.p+=2, *++p C.p+=3, *p++ D.*(&a[0][0]+6)
- 4 -
13.已知:int **p;,则变量p是( B )。
A.指向int的指针 B.指向指针的指针
C.int型变量 D.以上三种说法均是错误的
14.已知:int a[]={1, 2, 3, 4}, y, *p=&a[1];,则执行语句y=(*--p)++;之后,变量y的值为( A )。
A.1 B.2 C.3 D.4
15.已知:int b[]={1, 2, 3, 4}, y, *p=b;,则执行语句y=*p++;之后,变量y的值为( A )。
A.1 B.2 C.3 D.4
16.已知:int x[]={1, 3, 5, 7, 9, 11}, *ptr=x;,则能够正确引用数组元素的表达式是( B )。
A.x B.*(ptr--) C.x[6] D.*(--ptr)
17.已知:int x[]={1, 3, 5, 7, 9, 11}, *ptr=x;,则不能够正确引用数组元素的表达式是( B )。
A.*(ptr--) B.*(--ptr) C.*(ptr++) D.*(++ptr)
18.若有以下语句且0<=k<6,则正确表示数组元素地址的表达式是( C )。
- 5 -
static int x[]={1, 3, 5, 7, 9, 11}, *ptr=x, k;
A.x++ B.&ptr C.&ptr[k] D.&(x+1)
19.已知:int i, x[3][4];,则不能将x[1][1]的值赋给变量i的语句是( C )。
A.i=*(*(x+1)+1); B.i=x[1][1]; C.i=*(*(x+1)); D.i=*(x[1]+1);
20.已知:int a[2][3]={2, 4, 6, 8, 10, 12};,正确表示数组元素的地址是( A )。
A.*(a+1) B.*(a[1]+2) C.a[1]+3 D.a[0][0]
21.已知:int*p;,使用如下语句动态申请一个int型的存储单元,应当使用( D )。p=( )malloc(sizeof(int));
A.int B.int * C.(* int) D.(int *)
二、填空题
22.阅读程序,下面程序的输出结果是( 15 )。
#include - 6 - main() { static int a[2][3]={{1, 2, 3}, {4, 5, 6}}; int m, *ptr; ptr=&a[0][0]; m=(*ptr)*(*(ptr+2))*(*(ptr+4)); printf(\"%d\\n\ } 23.下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串.则①是( '\\0' 或 0 )、②是( ++ )。 main() { char str[81], *sptr; int i; for (i=0; i<80; i++) - 7 - { str[i]=getchar(); if (str[i]=='\\n') break; } str[i]= ① ; sptr=str; while (*sptr) putchar(*sptr ② ); } 24.在下面的程序中若第一个printf语句的输出为ffe2,则其余语句的输出结果分别为:①是( fff4 )、②是( a )、③是( 0 )、④是( b )。 main() { static int a[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p=a; printf(\"%x\\n\ /*输出结果为ffe2*/ printf(\"%x\\n\ /*输出 ① */ - 8 - printf(\"%x\\n\ /*输出 ② */ printf(\"%x\\n\ /*输出 ③ */ printf(\"%x\\n\ /*输出 ④ */ } 25.下面程序的输出结果,①是( m )、②是( a )、③是( w )、④是( z )、⑤是( mnopqr )。#include char *pp[2][3]={\"abc\ main() { printf(\"%c\\n\ /*输出 ① */ printf(\"%c\\n\ /*输出 ② */ printf(\"%c\\n\ /*输出 ③ */ printf(\"%c\\n\ /*输出 ④ */ - 9 - printf(\"%s\\n\ /*输出 ⑤ */ } 三、读程序,写结果 26.下面程序的运行结果是: ( □□□1□□□3□□□5□□□7 □□□9□□11□□13□□15 □□17□□19□□21□□23 )。(注:□表示空格。) #include main() { int a[3][4]={1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23}; int *p, i; for (p=a, i=0; p<&a[0][0]+12; p++, i++) - 10 - { if (i%4==0) printf(\"\\n\"); printf(\"%4d\ } } 27.下面程序的运行结果是( 3,3,3 )。 #include main() { int a=2, *p, **pp; pp=&p; p=&a; a++; printf(\"%d,%d,%d\\n\ - 11 - 练习7-3答案 一、选择题 1.main(argc, argv)中形式参数argv的正确说明形式应当为( A ). A.char *argv[] B.char argv[][] C.char argv[] 2.说明语句int (*p)();的含义是( C )。 A.p是一个指向一维数组的指针变量 B.p是指针变量,指向一个整型数据 C.p是一个指向函数的指针,该函数的返回值是一个整型 D.以上都不对 3.说明语句int *(*p)();的含义是( D )。 A.p是一个指向int型数据的指针 B.p是指针变量,它构成了指针数组 .char *argv - 12 - D C.p是一个指向函数的指针,该函数的返回值是一个整型 D.p是一个指向函数的指针,该函数的返回值是一个指向整型的指针 4.已知函数说明语句void *f();,则它的含义是( A )。 A.函数f的返回值是一个通用型指针 B.函数f的返回值可以是任意的数据类型 C.函数f无返回值 D.指针f指向一个函数,该函数无返回值 5.函数的功能是交换变量x和y中的值,并且通过正确调用返回交换的结果。能正确执行此功能的函数是( D )。 A.funa(int *x, int *y) B.funb(int x, int y) { int *p; {int t; *p=x; *x=*y; *y=*p; t=x; x=y; y=t; } } - 13 - C.func(int *x, int *y) D.fund(int *x, int *y) { *x=*y; *y=*x; {*x=*x+*y; *y=*x-*y; *x=*x-*y; } } 6.阅读程序,下面程序的输出结果是( B )。 假设可执行文件的文件名为:PROG.EXE 运行时键入的命令行为:PROG -386 NET3<回车> #include main(int argc, char *argv[]) {int i; for (i=0; i A.-386 B.PROG.EXE C.PROG.EXE .PROG - 14 - D NET3 -386 - -386 NET3 386 NET3 NET3 7.下面程序的运行结果是( A )。 #include f(int x, int y) {return(y-x); } main() {int a=5, b=6, c=2; int f(); int (*g)()=f; - 15 - c=(*g)(a, b); printf(\"%d\\n\ } A.1 B.2 C.3 D.前面三个答案均是错误的 8.若用数组名作为函数调用的实参,传递给形参的是( A )。 A.数组的首地址 B.数组第一个元素的值 C.数组中全部元素的值 D.数组元素的个数 二、填空题 9.下面的函数fun的功能是将形参x的值转换成二进制数,所得二进制数的每一位放在一维数组中返回,二进制的最低位放在下标为0的元素中,其他依次类推,则①是( 2 )、②是( 2 )。 fun(int x, int b[]) {int k=0, r; do - 16 - { r=x% ① ; b[k++]=r; x/= ② ; } while(x); } 10.函数expand(char s[], char t[])在将字符串s复制到字符串t时,将其中的换行符和制表符转换为可见的转义字符,即用\"\\n\"表示换行符,用\"\\"表示制表符。则①是( j++ )、②是( '\\\\' )、③是( j++ )、④是( '\\\\' )、⑤是( j++ )、⑥是( '\\0' )。 expand(char s[], char t[]) { int i, j; for (i=j=0; s[i]!='\\0'; i++) switch (s[i]) { case '\\n': t[ ① ]= ② ; t[j++]='n'; break; - 17 - case '\': t[ ③ ]= ④ ; t[j++]='t'; break; default: t[ ⑤ ]=s[i]; break; } t[j]= ⑥ ; } 三、读程序,写结果 11.以下程序的运行结果是( 10 7 5 3 -7 )。 main() { int a[5]={5, 10, -7, 3, 7}, i, j, t; sort(a); for (i=0; i<=4; i++) printf(\"%d \ } - 18 - sort(int a[]) { int i, j, t; for (i=0; i<4; i++) for (j=0; j<4-i; j++)