【C语言】数组相关选择题

目录

前言

题目一:

题目二:

题目三:

题目四:

题目五:

题目六:

题目七:

题目八:

题目九:

题目十:


前言

一些数组选择题


题目一:

关于数组描述错误的是:()

A .数组是一组相同类型元素的集合

B .数组的下标是从1开始的

C .数组的下标是从0开始

D .数组如果初始化,可以不指定数组的大小

选择B。

讲解:数组下标是从0开始。


题目二:

C语言中下面哪个数组的创建错误的:( )

A .int arr[10] = {0}

B .int n = 10; int arr[n] ={0}

C .int arr[] = {1,2,3,4,5,6,7,8,9,0}

D .char ch[10] = "hello bit"

选择B。

讲解:数组[]中存放的应为整型常量,而int n = 10为变量。在C99中,虽然支持变长数组,在数组定义时用变量作为数据大小,但变长数组不能初始化,而B选项数组初始化了。


题目三:

关于一维数组初始化,下面哪个定义是错误的?( )

A .int arr[10] = {1,2,3,4,5,6};

B .int arr[] = {1,2,3,4,5,6};

C .int arr[] = (1,2,3,4,5,6);

D .int arr[10] = {0};

选择C。

讲解:

  • 选项A是正确的。属于不完全初始化,未初始化部分以0表示。
  • 选项B是正确的。一维数组可以省略数组大小,即[]里的东西,会根据初始化的元素个数确定大小,但需要初始化。
  • 选项C错误。在数组初始化中,需要用{}进行包裹元素。
  • 选项D是正确的。这是一种常见的初始化方式,将数组元素全部初始化为0。

题目四:

以下能对二维数组a进行正确初始化的语句是:( )

A .int a[2][]={{0,1,2},{3,4,5}};

B .int a[][3]={{0,1,2},{3,4,5}};

C .int a[2][4]={{0,1,2},{3,4},{5}};

D .int a[][3]={{0,,2},{},{3,4,5}};

选择B。

讲解:

  • 选项A错误。二维数组中,可以省略行,但不能省略列,因为可以数组时连续存储的,可以通过列来确定数组大小,但需要初始化。
  • 选项B是正确的。二维数组可以省略行,选项中以3个元素一组,用{}包裹起来,其意思是一共有两行,每一行有3个元素。
  • 选项C错误。当已知道二维数组的行和列时,有两种初始化的方式:第一种跟一维数组一样,用{}将所有元素包裹起来;第二种外层一个{}包裹,内层根据行数,决定用几个{}包裹,内层的每一个{}里包裹的是每列的元素个数,如不够列数,则以0替代。选项C中用了第二种方式,但内层{}有3个,数组的行数为2,因此这是不符合语法的。
  • 选项D正确。内层有3个{},那就给数组的行分配为3,因为列数为3,则每个{}里的元素为3,不足3的则以0替代。

题目五:

定义了一维 int 型数组 a[10] 后,下面错误的引用是:( )

A .a[0] = 1;

B .a[0] = 5*2;

C .a[10] = 2;

D .a[1] = a[2] * a[0];

选择C。

讲解:

  • 选项A正确。数组下标从0开始,到n-1结束,给下标为0的位置赋值是可以的。
  • 选项B正确。赋值语句是从右向左执行的,会先计算完5*2表达式的结果,赋给下标为0的元素。
  • 选项C是错误的。数组的元素个数为10个,那末尾元素的下标为9,这种属于越界访问了。
  • 选项D正确。语句会先计算出a[2] * a[0]后,赋值个下标为1的元素。

题目六:

若定义int a[2][3]={1,2,3,4,5,6};则值为4的数组元素是( )

A .a[0][0]

B .a[1][0]

C .a[1][1]

D .a[2][1]

选择B.

讲解:

  • 选项A错误。已知二维数组的行和列,则会自动为{}里的元素进行划分,等价于{{1,2,3}, {4,5,6}},因此a[0][0]为第一行的第一个元素。
  • 选项B正确。查找值为4的元素,则该元素在第二行的第一个,那就是[1][0]。
  • 选项C错误。a[1][1]的元素为5。
  • 选项D错误。当访问行数2的下标时,属于越界访问。

题目七:

下面代码的结果是:( )

A .4

B .16

C .20

D .5

#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};
    printf("%d\n", sizeof(arr));
    return 0;
}

选择B。

讲解·:

  • 选项A错误。sizeof是单目操作符,计算元素的大小,单位是字节,在该题中,sizeof(arr)计算的是arr数组的大小,arr数组有4个元素,下标2的元素是一个逗号表达式的值,逗号表达式的结果是最后一个元素,选项A的结果为4是不正确的。
  • 选项B正确。数组名arr在ssizeof中时,表示整个数组大小,即字节大小,arr数组的大小是4,并且这是int形的数组,4字节,因此4*4为16字节。
  • 选项C错误。
  • 选项D错误。

题目八:

下面代码的结果是:( )

A .10 9

B .9 9

C .10 10

D .9 10

#include <stdio.h>
int main()
{
    char str[] = "hello bit";
    printf("%d %d\n", sizeof(str), strlen(str));
	return 0;
}

选择A。

讲解:

  • 选项A正确。sizeof为单目操作符,计算元素字节大小; strlen是库函数,计算字符串长度,遇到'\0'结束。对于字符数组,省略了数组大小,并且用双引号进行初始化时,末尾会隐藏一个\0,但会算作数组的大小,因此sizeof时为10字节,strlen计算\0之前的字符个数,则为9.
  • 选项B错误。
  • 选项C错误。
  • 选项D错误。

题目九:

以下说法正确的是( )

A .数组acX和数组acY等价

B .数组acX和数组acY的长度相同

C .sizeof(acX)>sizeof (acY)

D .strlen (acX)>strlen (acY)

char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g'};

选择C。

讲解:

  • 选项A错误。在字符数组中,省略数组大小,初始化有两种方式,一种为用双引号包裹元素,末尾会隐藏\0; 一种是用{}包裹字符。因此是不等价的。
  • 选项B错误。acX的初始化方式是用双引号包裹,末尾会隐藏一个\0,则数组大小比实际字符个数多一个。acY的初始化方式是用{}包裹字符,{}里的字符个数就是数组大小。因此两个数组的长度不相同。
  • 选项C正确。acX数组末尾隐藏\0,acY没有,因此sizeof时,acX会算上\0的字节。
  • 选项D错误。strlen库函数是计算\0之前的字符个数,遇到\0停止,acY用双引号的方式末尾隐藏\0,acY末尾没有\0,因此strlen两个数组时,acX数组能准确计算出数组的元素个数,但acY因为没有\0,则strlen会一直计算,直到遇到\0,因此acY返回的是一个随机数,但肯定比acX大。

题目十:

关于一维数组描述不正确的是:( )

A .数组的下标是从0开始的

B .数组在内存中是连续存放的

C .数组名表示首元素的地址

D .随着数组下标的由小到大,地址由高到低

选择D。

讲解:

  • 选项A正确。数组下标从0开始,数组大小-1结束。
  • 选项B正确。数组在内存中是连续存储的,因此数组经常可以用指针来表示,可以通过指针加减操作访问连续地址。
  • 选项C正确。数组名正常情况是表示首元素地址的,但有两个例外:第一个为sizeof(数组名)时,此时数组名表示整个数组的字节大小;第二个为&数组名,此时表示整个数组的地址,通过加操作,会跳过整个数组字节个数的位置。
  • 选项D错误。数组随着下标从小到大,地址是由低到高的。

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值