AI智能推荐题库-试题通 AI智能整理导入题库-试题通
×
首页 题库中心 c语言选择判断题库 题目详情
CA4E3A01C46000013755684012D01E55
c语言选择判断题库
379
单选题

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语言选择判断题库

扫码进入小程序
随时随地练习

关闭登录弹窗
专为自学备考人员打造
勾选图标
自助导入本地题库
勾选图标
多种刷题考试模式
勾选图标
本地离线答题搜题
勾选图标
扫码考试方便快捷
勾选图标
海量试题每日更新
波浪装饰图
欢迎登录试题通
可以使用以下方式扫码登陆
APP图标
使用APP登录
微信图标
使用微信登录
试题通小程序二维码
联系电话:
400-660-3606
试题通企业微信二维码