1.以下scanf
函数调用语句中不正确的是_C_。
struct pupil {
char name[20];
int age;
int sex;
} pup[5], *p=pup;
A.scanf("%s", pup[0].name);
B.scanf("%d", &pup[0].age);
C.scanf("%d", p->age);
D.scanf("%d", &(p->sex));
误区:scanf用法
变量名前的&地址符号不能缺少。但是当以%s读入数据时,不能加&,因为字符串变量名代表首地址。
2.假设scanf
语句执行时输入ABCDE
<回车>,能使puts(s)
语句正确输出ABCDE
字符串的程序段是_D_。
A.char s[5]={"ABCDE"}; puts(s);
B.char s[5]={'A', 'B', 'C', 'D', 'E'}; puts(s);
C.char *s; scanf("%s", s); puts(s);
D.char *s; s="ABCDE"; puts(s);
分析:puts函数遇到'\0'时停止输出,而A,B中元素全满,不含’\0‘,所以A,B错
C选项,要知道,字符串读入进来是要存起来的,而s只是个指针,存不下这么多字符。必须是char s[6];scanf("%s",s);puts(s);
D选项是正确的,"ABCDE"作为静态常量存储于程序段,地址赋给s,可以正常输出
3.For the function declaration void f(char ** p)
,the definiti A_ of var
makes the function call f(var)
incorrect。
A.char var[10][10];
B.char *var[10];
C.void *var = NULL;
D.char *v=NULL, **var=&v;
分析:1.char var[10][10];var的类型是 char (*)[10] 类型(不理解的话需要好好看看课本)
2.char *var[10]; var数组是存放char *类型的数组,数组名var是数组var元素的首地址,所 以var的类型是char**类型
3.void * 是定义没有指针类型的指针,在c99中举个例子int *p = malloc(sizeof(int)); 可以不 写强制类型转换,因为malloc返回一个void *类型的指针,写强制类型转换是为了看起来方 便,不懂再去看书
4.v是char*类型的,那么取v的地址肯定是char**类型的,所以var是char**类型的。
4.For definitions: char s[2][3]={"ab", "cd"}, *p=(char *)s;
the expression _D_ is correct and its value is equivalent to the element s[1][1]
.
A.*(s+3)
B.*s+2
C.p[1][1]
D.*++p+2
分析:s[1][1] = 'd',这个应该没问题吧?第二个字符串的第二个字符。
*++p+2 这个比较有趣,p是一个char*指针,指向字符数组首地址,&s[0][0]。
首先++的优先级更高执行++p得到的是&s[0][1],然后*运算符解引用,得到s[0][1]
s[0][1]的字符是'b',然后'b'+2,得到的就是'd'的ASCII码。
5.在基类型相同的两个指针变量之间,不能进行的运算是(c )。
A.<
B.=
C.+
D.–
分析:“<” 可以比较两个指针所指向的地址大小
“-” 可以计算两个指针所指地址之间相隔多少个这种基类型的空间
"=" 赋值
"+" 没有意义
6.若有定义int a[4][5];
下列语句中( D )是存在语法错误的。
A.*a
B.*(*(a+2)+3)
C.&a[2][3]
D.++a
分析:数组名为首地址是常量不能加减,如果是指针则可以加减。
7.According to the declaration: int p[5], *a[5];
the expression ______ is correct.
A.p=a
B.p[0] = a
C.*(a+1)=p
D.a[0]=2
分析:只有两边的类型一致才可以赋值