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"; 表示s是一个指向字符串的指针变量,将字符串的首地址赋给s(T)
4.当语句int *p; *p=50; 执行后不会有错误(F)
分析:*p是一个指针变量,需要先给它分配一个可用的地址,然后才能像这样赋值。
5. 当调用函数比较字符串大小时,通常越长的字符串会越大(F)
比较的是两个字符串的ASCII码大小而不是长度。
6、不同类型的结构体变量也可以直接赋值(F)
当结构体包含基本类型时,可以赋值,但是当结构体包含链表、动态数组或指针时,就不适合赋值了。
7、假设结构体指针p已经定义并正确赋值,并且它指向的结构体变量有一个int num类型的成员,则语句*p.num=100; 正确的是(F)
指针应该是 *p->num
8、下面的结构体定义,++p->str中的++加到_(D)
{
int 长度;
字符*str;
} *p;
A. 在指针 str 上
B. 指针 p 上的粗体样式
c.str指的是内容
D.以上都不是
-> 优先级高于++,相当于++(p->str)。 ++作用于p的成员变量str。
结构链表
9、根据int(*p)[10]的说法,p是a(B)
A.阵列
B.指针
C.功能
D. 数组元素
是一个辅助指针数组。 元素都是指针。 它与一级指针数组没有什么不同。 第一级指针数组的形状为:*p[10]。 指向数组的指针是:(*p)[10];
10、对于头节点为head的单链表,判断该链表为空链表的条件为(B)。
A。
B.头→
C.head→下一个==head
D.head!=NULL
头指针单向链表的第0个节点称为整个链表的头节点。 头节点存储一个地址,该地址指向一个元素。 头节点一般不存储具体数据,只存储第一个节点。 的地址。
head→next=NULL 头节点指向null,因此是一个空链表。
11. 以下算法创建一个包含 n 个元素的前导单链表。
索引节点
{ 整数数据;
下一个l节点;
}l节点,
void (&head, int n)
p; 整数我;
头=()((lnode));
/这里的选项( )/
for(i=n;i>0;i–)
p =()((lnode));
scanf(“%d”,&p->数据);
/这里的选项( )/
/这里的选项( )/
。
头->下一个=空
p->下一个=头->下一个
头->下一个=p
替换为错误术语
链表不具备的特性是(D)
A.插入和删除不需要移动元素
B. 随机访问任意元素
C. 无需提前预估存储空间
D、所需空间与线性长度成正比
12、在单链表头中,如果想在指针p指向的节点后面插入指针q指向的节点,则执行(D)
ap->下一个=q->下一个; q->下一个=p;
Bq->下一个=p->下一个; p=q;
cp->下一个=q->下一个; p->下一个=q;
Dq->下一个=p->下一个; p->下一个=q;
要向单链表中插入元素,必须首先生成指针 p 指向的节点。 选项D中的第一条语句将插入位置之后的元素称为其后继节点,后一条语句使p调用q的后继节点,同时断开p的前一个后继节点与p的连接。
13、在单链表头中,如果要删除指针p指向的节点的后继节点,执行(D)
Ap=p->下一个;免费§;
bp->下一个=p->下一个->下一个; 自由的§;
Cq= p->下一个 q->下一个=p->下一个; 自由(q);
Dq=p->下一个; p->下一个=q->下一个; 自由(q);
链表使用一组任意存储单元来存储线性表的节点。 除了存储每个节点的值之外,还存储其后继节点的指针以及头指针。 单链表的指针字段只有一个指向后继节点的指针。 如果要删除p节点的后继节点,只需让P节点的指针p↑.next指向其后继节点指针指向的节点p↑即可。 .next↑.next 就足够了。
14、在已建立的单向链表中的节点q后面插入一个新节点p,所有节点都有如下形式的结构定义:
节点{
整数数据;
节点*下一个;
}*p,*q,*头;
正确的操作是:(D)
aq->下一个=p;
bp->下一个=q->下一个; q=p
Cq->下一个=p; p->下一个=q->下一个;
dp->下一个=q->下一个; q->下一个=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)
Ap=最大;
B.*p=最大值;
Cp=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 0; i--) {
s = s + i;
正确答案:A、B、D、E
22、下面定义了一个一维数组str,可以存储81个字符数据。
字符str[81]; (T)
[ ] 中包含的数字是数组的长度,这是正确的,因为数组是 char 类型。
23、假设执行scanf语句时输入ABCDE。 能够使puts(s)语句正确输出ABCDE字符串的程序段是__D。
A.char s[5]={“ABCDE”}; 看跌期权;
B.char s[5]={'A', 'B', 'C', 'D', 'E'}; 看跌期权;
C.char *s; scanf("%s", s); 看跌期权;
D.char *s; s=“ABCDE”; 看跌期权;
在选项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。
Aa数组中行索引为2、列索引为3的元素的地址
Ba 数组中行索引为 2、列索引为 3 的元素的值
Ca数组第2行的首地址
Da数组第3行首地址
a[2]是这个二维数组第三行的数组名,也是该行第一个元素的地址。 因此,+3表示该行第四个元素的地址。
25、有两个字符数组a和b,则下列正确的输入语句是(B)
A.获取(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);” 是正确的用法。