当前位置:网站首页>C语言数组专题训练

C语言数组专题训练

2022-07-05 06:36:00 一只嵌入式爱好者

第一题

若有语句char s1[10], s2[10] = {“books”};则能将字符串 books 存放到数组 s1 的正确语句是( )
A、strcpy(s1, s2);
B、s1 = {“books”};
C、s1 = s2;
D、strcpy(s2, s1);
答案:A
解析:数组名代表的是数组的首地址,是一个地址常量,所以不能给数组名赋值,C错误。strcpy函数原型如下

char *strcpy(char *dest, const char *src)

第二题

线性表是________。
A、一个有限序列,可以为空
B、一个有限序列,不可以为空
C、一个无限序列,可以为空
D、一个无限序列,不可以为空
答案:A
解析:线性表包括链表数组,数组就是有限的,线性表可以初始化为空,线性表中没有元素时,就是一个空表。
在这里插入图片描述
推荐阅读:逻辑结构与物理结构

第三题

以下哪个选项正确定义了一维数组。()
A、char a[] = {‘0’, ‘1’, ‘2’, ‘3’, ‘\0’};
B、char a = {‘A’, ‘B’, ‘C’};
C、int a[] = “0123”;
D、int a[3] = {0, 1, 2, 3};
答案:A
解析:B选项中a并没有定义成数组,而是字符,会出错;C选项整型数组不能被赋值字符串;D选项定义的初值个数超过了数组的长度;

第四题

设有序表的关键字序列为{1,4,6,10,18,35,42,53,67,71,78,84,92,99},当用二分查找法查找键值为35的结点时,经()次比较后查找成功。
答案:4
解析:
第1次
1,4,6,10,18,35,42,53,67,71,78,84,92,99
left=0,right=13,mind=6; mid值为42,太大
第2次
1,4,6,10,18,35,42,53,67,71,78,84,92,99
left=0,right=5,mind=2; mid值为6,太小
第3次
1,4,6,10,18,35,42,53,67,71,78,84,92,99
left=3,right=5,mind=4; mid值为18,太小
第4次
1,4,6,10,18,35,42,53,67,71,78,84,92,99
left=5,right=5,mind=5; mid值为35,找到了

第五题

稀疏矩阵一般的压缩存储方式有两种,即 ()
A、二维数组和三维数组
B、三元组和散列
C、三元组和十字链表
D、散列和十字链表
答案:C
解析:所谓三元组就是一个元素存放三个信息,矩阵中的行号,列号以及值,这样就可以不存放值为0的元素,实现压缩。 十字链表相当于是邻接表和逆邻接表的合集,在一个元素里面存放了值以及出度表和入度表,这样也不需要像邻接矩阵那样存放大量0元素,而且找一个节点的入节点和找出节点一样快。

一个二维十字链表是链表的元素同时链接左右水平邻结点与上下垂直邻结点。
典型用于稀疏矩阵存储时,矩阵每个元素为以下五元组:

typedef struct OLNode 
{
     
    int LineNumber, ColumneNumber; //行号与列号
    ElemType value; //值
    struct OLNode *right, *down; //同行、同列下一个元素的指针
} OLNode, *OList; 

第六题

以下选项中,正确定义二维数组的是哪个选项()
A、char a[2][2] = ‘a’, ‘b’, ‘c’, ‘d’;
B、int a[][] = { {1, 2, 3}, {4, 5, 6}};
C、int a[2][] = {1, 2, 3, 4, 5, 6};
D、int a[][4] = {1, 2, 3, 4, 5, 6};
答案:D
解析:定义字符型数组时不允许直接使用“字符常量”的方式赋初值,C语言规定,二维数组定义时不允许省略第二维的长度,所以选项A、B、C错误。二维数组定义时允许省略第一维的长度,因此选项D正确。

第七题

已知int a[3][4];则下列能表示a[1][2]元素值的是()
A、*( *(a+1)+2)
B、 *(a+1+2)
C、(&a[0]+1)[2]
D、 *(a[0]+1)
答案:A
解析:在二维数组中,数组名是第一个数组的地址,注意这里a不是第一个元素的地址,而是第一个维数组的地址,a[0][0]才是表示的一维数组第一个元素的地址。地址 + 1表示向下移一层。

A, a 是一个二级指针,不是一级指针,*(a+1)表示的第二个数组的地址
B, * (a+1+2)等于 *(a+3),是一个int *, 表示的是第4个数组a[3]的地址,而 **(a+3)表示a[3][0]的值, *((int *)(a+3)) 也可以表示 a[3][0]的值
C. (&a[0]+1)表示的是第2个数组 a[1]的地址,(&a[0]+1)[2]其实是数组a[3]的地址,改成((int *)(&a[0]+1))[2] 才是对的
D. *(a[0]+1) 是 a[0][1]的值

第八题

执行以下代码段会输出什么结果。()

int a[][3] = {
    1, 2, 3, 4, 5, 6, 7, 8, 9}; 
char k;
for (k = 0; k < 3; k ++)
    printf("%d ",a[k][2-k]);

A、1 3 5
B、3 5 7
C、3 6 9
D、编译出错或其他都不对
答案:B
解析:二维数组必须指定列数,题目已指定且不越界,所以不会出错。

a[0][0]=1 a[0][1]=2 a[0][2]=3 
a[1][0]=4 a[1][1]=5 a[1][2]=6
a[2][0]=7 a[2][1]=8 a[2][2]=9

for循环里输出a[0][2]=3 a[1][1]=5 a[2][0]=7

第九题

int A[2][3]={1,2,3,4,5,6}; 则A[1][0]和*(*(A+1)+1)的值分别是()
A、4 5
B、4 3
C、3 5
D、3 4
答案:A
解析:数组A一共2行3列,第0行为123,第1行为456。A[1][0]为第1行第0列数字4。 * (A+1)指向数组第1行第0个元素, * (A+1)+1指向数组第1行第1个元素,再取 * 则为第1行第1个元素的值5,因此为4,5。

第十题

下列说法正确的是()
A、二维以上的数组其实是一种特殊的广义表
B、数组一旦建立,结构的元素个数和元素间的物理存储关系就不再变化
C、数组是一种线性结构,因此只能用来存储线性表
D、数组采用顺序存储方式表示
答案:A B D
解析:关于这一题,我们需要区分数据的物理结构与逻辑结构。物理结构主要是指存储方式,包含线性存储与链式存储,它是从计算机存储的角度去考虑。逻辑结构指的是数据之间的关系,有线性关系和链式关系等,主要是从人为定义角度去考虑。数组是一种被人们定义为线性关系的表,至于其存储结构,可以用线性存储也可以是链式存储去存储。
推荐阅读:逻辑结构与物理结构

第十一题

原网站

版权声明
本文为[一只嵌入式爱好者]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45905650/article/details/125499654