单选题
1.设有以下语句, 若0<k<4,下列选项中对字符串的非法引用是()。 char str[4][2]={“aaa”,”bbb”,”ccc”,”ddd”},*strp[4]; int j; for (j=0;j<4;j++) strp[j]=str[j];
A
strp
B
str[k]
C
strp[k]
D
*strp
答案解析
正确答案:A
解析:
这是一道关于 C 语言中**二维数组**、**指针数组**以及**字符串引用**的经典题目。我们需要分析每个选项的数据类型和合法性,特别是结合题目给定的条件 $0 < k < 4$。
### 1. 代码与变量分析
首先,我们拆解定义的变量:
* `char str[4][2] = {"aaa", "bbb", "ccc", "ddd"};`
* 这里定义了一个 $4 \times 2$ 的字符二维数组。
* **注意**:虽然初始化列表中的字符串如 `"aaa"` 长度为 3(加上结束符 `\0` 为 4),但数组第二维大小仅为 2。在 C 语言中,这会导致截断或编译警告/错误(取决于编译器标准),但在本题语境下,我们主要关注**类型系统**。
* `str` 是二维数组名。
* `str[i]` 表示第 $i$ 行的首地址,类型为 `char *`(指向字符的指针)。
* `str` 本身作为数组名,在大多数表达式中退化为指向第一行的指针,类型为 `char (*)[2]`(指向包含2个字符的数组的指针)。
* `char *strp[4];`
* 这是一个**指针数组**,包含 4 个元素,每个元素都是 `char *` 类型。
* `for (j=0; j<4; j++) strp[j] = str[j];`
* 这个循环将 `str` 每一行的首地址赋值给 `strp` 对应的元素。
* 此时,`strp[0]` 指向 `str[0]`,`strp[1]` 指向 `str[1]`,以此类推。
* `strp[k]` 的类型是 `char *`,它存储的是一个地址,指向具体的字符串数据。
### 2. 选项逐一解析
题目要求找出**非法引用**。这里的“引用”通常指能否合法地访问到字符串内容或者是否符合指针/数组的操作规范。
#### A. `strp`
* **分析**:`strp` 是指针数组的数组名。
* **类型**:在表达式中,`strp` 退化为指向数组第一个元素的指针,即 `char **` 类型(指向指针的指针)。
* **合法性判断**:
* 如果题目问的是“哪个不能代表一个字符串(`char *`)”,那么 `strp` 是一个二级指针,它指向的是指针数组的首地址,而不是直接指向字符串内容的字符指针。
* 更重要的是,在很多语境下(尤其是作为函数参数或打印字符串时),直接使用 `strp` 而不加解引用或下标,无法直接获取某个具体的字符串内容。
* 对比其他选项,B、C、D 都能直接或间接得到 `char *` 或 `char` 类型,从而操作字符串。而 `strp` 本身是 `char **`,若将其当作字符串(`char *`)使用(例如传给 `printf("%s", strp)`),则是**类型不匹配**,属于非法使用/引用字符串的方式。
* **结论**:`strp` 是指针数组的名,代表地址的地址,不能直接作为字符串引用。
#### B. `str[k]`
* **分析**:`str` 是二维数组,`str[k]` 表示第 $k$ 行。
* **类型**:`char *`(数组名退化为首元素地址)。
* **合法性**:由于 $0 < k < 4$,即 $k$ 可以是 1, 2, 3。这些索引都在数组范围 `[0, 3]` 内。`str[k]` 合法地指向第 $k$ 个字符串的首地址。
* **结论**:合法。
#### C. `strp[k]`
* **分析**:`strp` 是指针数组,`strp[k]` 取出数组中第 $k$ 个元素。
* **类型**:`char *`。
* **合法性**:前面循环中已经执行了 `strp[j] = str[j]`。因此 `strp[k]` 存储的就是 `str[k]` 的地址。由于 $k$ 在合法范围内,这也是一个合法的字符串指针。
* **结论**:合法。
#### D. `*strp`
* **分析**:`strp` 是数组名,指向 `strp[0]`。`*strp` 等价于 `strp[0]`。
* **类型**:`char *`。
* **合法性**:`strp[0]` 在循环中被赋值为 `str[0]`。因此 `*strp` 指向第一个字符串 `"aaa"`(尽管被截断,但语法上是合法的字符串指针引用)。
* **结论**:合法。
### 3. 为什么选 A?
题目问的是“对字符串的非法引用”。
* **B (`str[k]`)**、**C (`strp[k]`)**、**D (`*strp`)** 的结果类型都是 `char *`,它们都直接指向内存中的字符数据,可以被 `%s` 格式输出或用于字符串操作函数,是合法的字符串引用。
* **A (`strp`)** 的结果类型是 `char **`。它指向的是指针变量本身,而不是字符数据。如果你尝试用处理字符串的方式去使用 `strp`(例如 `printf("%s", strp)`),程序会出错,因为 `%s` 期望的是 `char *`,而你提供的是 `char **`。因此,相对于其他三个选项,`strp` 不能直接作为“字符串”来引用。
### 最终答案
**A**
题目纠错
c语言选择判断题库
相关题目
单选题
1、以下叙述中正确的是 ()。
单选题
1、以下符合C语言语法的赋值表达式是()。
单选题
1、下面四个选项中,均是不合法的浮点数的选项是()。
单选题
1、下列语句的输出结果是()。
单选题
1、执行下列语句后,a和b的值分别为()。 int a,b; a=1+'a'; b=2+7%-4-'A';
单选题
1、以下数据中,不正确的数值或字符常量是()。
单选题
1、以下能对二维数组a进行正确初始化的语句是()。
单选题
1、下列程序的输出为()。 main() 
单选题
1、假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};, 则数组x在内存中所占字节数是()。
单选题
1、下列字符序列中,不可用作C语言标识符的是()。
