单选题
1、第216题 (1.0分) 题号:166 下列定义数组的语句中不正确的是()。
A
static int a[2][3]={1,2,3,4,5,6};
B
static int a[2][3]={{1},{4,5}};
C
static int a[][3]={{1},{4}};
D
static int a[][]={{1,2,3},{4,5,6}};
答案解析
正确答案:D
解析:
这道题考查的是 C 语言中二维数组的定义和初始化规则。我们需要逐一分析每个选项,找出不符合语法规则的那一个。
**核心知识点:**
在 C 语言中定义二维数组时:
1. **第一维(行)可以省略**:编译器可以根据初始化的内容自动推断行数。
2. **第二维(列)不可省略**:编译器必须知道每一行有多少个元素,才能正确计算内存布局和地址偏移。因此,`a[][N]` 是合法的,但 `a[][]` 或 `a[M][]` 是非法的。
**选项分析:**
* **A. `static int a[2][3]={1,2,3,4,5,6};`**
* **分析**:明确指定了行数为 2,列数为 3。初始化列表中有 6 个元素,按顺序填充到数组中。
* **结果**:合法。等价于 `a[0][0]=1, a[0][1]=2, ..., a[1][2]=6`。
* **B. `static int a[2][3]={{1},{4,5}};`**
* **分析**:明确指定了行数为 2,列数为 3。使用嵌套花括号进行分行初始化。
* 第一行 `{1}`:第一个元素为 1,其余补 0。即 `1, 0, 0`。
* 第二行 `{4,5}`:前两个元素为 4, 5,其余补 0。即 `4, 5, 0`。
* **结果**:合法。未显式赋值的元素自动初始化为 0。
* **C. `static int a[][3]={{1},{4}};`**
* **分析**:省略了第一维(行数),但指定了第二维(列数)为 3。
* 编译器根据初始化列表 `{{1},{4}}` 判断出有 2 个大括号组,因此推断行数为 2。
* **结果**:合法。编译器能确定数组大小为 `a[2][3]`。
* **D. `static int a[][]={{1,2,3},{4,5,6}};`**
* **分析**:同时省略了第一维和第二维。
* 如前所述,**二维数组的第二维(列下标)不能省略**。编译器无法仅凭 `{1,2,3}` 这样的内部结构在没有外部约束的情况下确定列宽(虽然人类可以看出是3,但 C 语言语法规定必须显式指定列数,或者通过字符串初始化等特殊情况,但对于整型数组,列数必须已知)。
* **结果**:**不合法**。编译时会报错,提示缺少数组维度大小。
**结论:**
选项 D 违反了“二维数组定义时第二维长度不可省略”的规则。
故正确答案是 **D**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第43题 (1.0分) 题号:669 若用数组名作为函数的实参,传递给形参的是()。
单选题
1、第42题 (1.0分) 题号:518 char a[]=“This is a program.”;输出前5个字符的语句是()。
单选题
1、第41题 (1.0分) 题号:500 下列程序段的输出结果为()。 int x=3,y=2; printf(”%d”,(x-=y,x*=y+8/5));
单选题
1、第40题 (1.0分) 题号:632 以下叙述正确的是()。
单选题
1、第39题 (1.0分) 题号:94 在C语言中,能代表逻辑值”真”的是()。
单选题
1、第38题 (1.0分) 题号:151 以下程序的运行结果是()。
单选题
1、第37题 (1.0分) 题号:693 以下各选项企图说明一种新的类型名,其中正确的是()。
单选题
1、第36题 (1.0分) 题号:509 int a=1,b=2,c=3; if( )a=b; if( )a=c; 则a的值为()。
单选题
1、第35题 (1.0分) 题号:571 以下叙述正确的是()。
单选题
1、第34题 (1.0分) 题号:550 不仅可将C源程序存在磁盘上,还可将数据按数据类型分别以什么的 形式存在磁盘上()。
