目录
前言
题目一:
题目二:
题目三:
题目四:
题目五:
题目六:
题目七:
题目八:
题目九:
题目十:
前言
一些数组选择题
题目一:
关于数组描述错误的是:()
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错误。数组随着下标从小到大,地址是由低到高的。