PTA错题收录

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

分析:只有两边的类型一致才可以赋值

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值