C语言填空选择错题总结

C语言填空选择错题总结

pta错题集合

1.直接访问就是直接利用变量的地址直接进行访问。 (T)

直接访问:按照C的方式,如果定义一个变量,系统会给这个变量分配一块内存,变量有两个属性,变量值和变量地址。变量地址指示了该变量在内存中的存储位置,变量值是这块内存中的内容。要访问这块内存空间上的内容,可以直接使用变量名。
间接访问:间接访问的含义是先从其它内存空间获得要访问的内存地址,根据得到的地址访问目的地址。

2.int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素。 (F)

1、int(*p)[4];------ptr为指向含4个元素的一维整形数组的指针变量(是指针)
2、int p[4];-------定义指针数组p,它由4个指向整型数据的指针元素组成(是数组)
3、int(
)[4];--------实际上可以看作是一种数据类型。也就是第一个(int(*p)[4];)

3.char *s=“C Language”;表示s是一个指向字符串的指针变量,把字符串的首地址赋予s (T)

4.语句int *p; *p=50;执行时,不会有任何错误 (F)

解析:*p是一个指针变量,需赋值一个可用的地址之后才可这样赋值。

5.调用strcmp函数比较字符串大小时,通常较长的字符串会较大(F)

比较的是两个字符串的ASCII码大小而不是长度

6.不同类型的结构变量之间也可以直接赋值 (F)

当结构中包含的是基本类型时则可以赋值,而当结构中包含链表,动态数组或指针时则不宜赋值

7.假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 *p.num=100; 是正确的 (F)

指针后应为*p->num

8.对于以下结构定义,++p->str中的++加在_ (D)

struct {
int len;
char *str;
} *p;
A.指针str上
B.指针p上加粗样式
C.str指的内容上
D.以上均不是

->的优先级高于++,等价于++(p->str),++作用在p的成员变量str上

结构体链表

9.根据声明int (*p)[10], p是一个(B)

A.数组
B.指针
C.函数
D.数组的元素

是二级指针数组。元素全都是指针。和一级指针数组没什么区别的。一级指针数组形如:*p[10].而指向数组的指针为:(*p)[10];

10.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是(B)。
A.headNULL
B.head→next
NULL
C.head→next==head
D.head!=NULL

头指针的单链表其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址。
head→next=NULL 头结点指向的是一个null,所以为空链表。

11.下列算法创建n个元素的带头单链表

typedef struct lnode
{ int data;
struct lnode next;
}lnode,linklist
void create(linklist &head, int n)
{
linklist p; int i;
head=(linklist)malloc(sizeof(lnode));
/此处选项( )/
for(i=n;i>0;i–)
{
p =(linklist)malloc(sizeof(lnode));
scanf(“%d”,&p->data);
/此处选项( )/
/此处选项( )/
}
}

head->next=null

p->next=head->next

head->next=p

替换为错误项

链表不具有的特点是(D)

A.插入、删除不需要移动元素
B.可随机访问任一元素
C.不必事先估计存储空间
D.所需空间与线性长度成正比

12.在一个单链表head中,若要在指针p所指结点后插入一个q指针所指结点,则执行(D)

A.p->next=q->next; q->next=p;
B.q->next=p->next; p=q;
C.p->next=q->next; p->next=q;
D.q->next=p->next; p->next=q;

在一个单链表中插入一个元素,首先要生成一个指针p指向的结点,选项D中的第一条语句让插入位置之后的元素称为其后继结点,后一条语句使p称为q的后继结点,同时断开之前p的后继结点与p的联系。

13.在一个单链表head中,若要删除指针p所指结点的后继结点,则执行(D)

A.p=p->next;free§;
B.p->next=p->next->next; free§;
C.q= p->next q->next=p->next; free(q);
D.q=p->next; p->next=q->next; free(q);

链表是用一组任意的存储单元来存放线性表的结点.在存储的每个结点值的同时,还存储了其后继结点的指针,另外还有头指针。单链表的指针域只有一个指向后继结点的指针,若要删除p结点的后继结点,只需让P结点的指针p↑.next指向其后继结点指针所指向的结点p↑.next↑.next即可。

14.向建立好的单向链表中的结点q后插入一个新结点p,且所有结点都已具有如下形式的结构定义:

struct node{
int data;
struct node *next;
}*p, *q, *head;
则操作正确的是:(D)

A.q->next=p;
B.p->next=q->next; q=p
C.q->next=p; p->next=q->next;
D.p->next=q->next; q->next=p;

删除p所指结点的后续结点,即把p所指结点的后续的后续结点的地址(p→next→next)赋值给p结点的next域。

15.指针数组的每个元素都是一个指针变量 (T)

数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。

16.若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, (A )是正确的。

A.p2 = p1;
B.p2 = **p1;
C.p2 = &p1;
D.p2 = *p1;

&p1取得变量的地址,然后*(&p1)得到内容,即指变量的值

17.若有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方式是(A)

A.p=max;
B.*p=max;
C.p=max(a,b);
D.*p=max(a,b);

函数的入口地址赋给指针后就可以用该指针调用函数了

18.以下数组定义中错误的是( B)

A.int x[][3]={0};
B.int x[2][3]={{1,2},{3,4},{5,6)};
C.int x[][3]={{1,2,3},(4,5,6)};
D.int x[2][3]={1,2,3,4,5,6};

二维数组的初始化有以下几种形式:①分行进行初始化;②不分行的初始化;③部分数组元素初始化;④省略第一维的定义,不省略第二维的定义。选项B)等号右边分了3行,大于等号左边数组的行数2。

19.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)F

数组名绝对不等于指针,而且不是指针。
指针是一个变量,变量的值是另外一个变量的地址。那么,既然指针是变量,那么指针必然有自己的存储空间,只不过是该存储空间内的值是一个地址值,而不是别的内容。
数组名仅仅是一个符号,不是变量,它没有自己的存储空间,而指针实实在在的是个变量,有自己的空间

20.一维数组定义的一般形式如下,其中的类型名指定数组中每个元素的类型。

类型名 数组名[数组长度]; (T)

类型名是整个数组的类型

21.以下程序段( )的功能是求 s=1+2+…+n−1。 (1分)
A,int n = 10, s = 0;
for ( int i = 1; i < n; i++ ) {
s = s + i;
}
B,int n = 10, s = 0;
for ( int i = 1; i < n; ++i ) {
s = s + i;
}
C,int n = 10, s = 0;
for (int i = n-1; i > 0; ++i ) {
s = s + i;
}
D,int n = 10, s = 0;
for ( int i = 1; i <= n-1; ++i ) {
s = s + i;
}
E,int n = 10, s = 0;
for (int i = n-1; i > 0; i-- ) {
s = s + i;
}
正确答案:A,B,D,E

22.以下定义了一个一维数组str,该数组可以存放81个字符型数据。

char str[81]; (T)

[ ]中包含的数字为该数组的长度,由于该数组为char型所以正确

23.假设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);

A选项中字符串数组大小为5只能放ABCDE,放不下’\0’了。如果大小为6,会自动在后面补’\0’
B选项与A一样,放不下’\0’
C选项,楼主要知道,字符串读入进来是要存起来的,而s只是个指针,存不下这么多字符。必须是char s[6];scanf("%s",s);puts(s);
D选项是正确的,"ABCDE"作为静态常量存储于程序段,地址赋给s,可以正常输出。

24.有说明语句int a[4][5];,则a[2]+3表示__A。

A.a数组行下标为2、列下标为3的元素的地址
B.a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址

a[2]就是这个二维数组的第三行的数组名,也是这一行首元素的地址,所以,+3就表示是该行第4个元素的地址。

25.有两个字符数组a,b,则以下正确的输入语句是(B)

A.gets(a,b);
B.scanf("%s%s",a,b);
C.scanf("%s%s",&a,&b);
D.gets(“a”),gets(“b”);

对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&“操作符。
所以“A.scanf(”%s%s",&a,&b)”中,变量a、b多携带了“&”操作符,是错误的。而对于gets()函数的使用,其中参数为字符串变量(字符串数组名或字符串指针),所以“B.gets(a); gets(b);”是正确的用法。

  • 24
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值