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

1、〖第20题〗96) 若有下列定义,则对a数组元素地址的正确引用是()。 int a[5],*p=a;

A
 *(p+5)
B
 *p+2
C
 *(a+2)
D
 *&a[5]

答案解析

正确答案:C

解析:

这道题考查的是 C 语言中**数组名、指针与地址**之间的关系,以及**解引用运算符 `*`** 的作用。 ### 1. 题目分析 * **定义**:`int a[5]` 定义了一个包含 5 个整数的数组 `a`,其有效下标为 `0` 到 `4`。 * **定义**:`*p = a` 定义了一个指针 `p`,并使其指向数组 `a` 的首元素(即 `p` 等价于 `&a[0]`)。 * **核心要求**题目问的是“对 a 数组元素**地址**的正确引用”。 * **注意**:这里题目表述可能存在歧义或印刷错误。通常这类题目问的是“对 a 数组元素的正确引用”(即获取元素的值)或者“对 a 数组元素地址的正确表示”。 * 让我们逐一分析选项,看哪个符合 C 语言的语法规范且逻辑正确。 ### 2. 选项逐一解析 * **A. `*(p+5)`** * `p` 指向 `a[0]`。 * `p+5` 指向 `a[5]` 的位置。 * 但是,数组 `a` 的大小为 5,有效索引是 `0~4`。`a[5]` **越界**了。 * 虽然语法上 `*(p+5)` 是合法的表达式(它试图访问越界内存的值),但它不是对合法数组元素的引用。更重要的是,`*(...)` 得到的是**值**,而不是**地址**。如果题目问的是“值”,这也是错误的(因为越界)。如果题目问的是“地址”,格式也不对(地址不应带 `*`)。 * **B. `*p+2`** * `*p` 取出指针 `p` 指向的值,即 `a[0]` 的值。 * `*p+2` 等于 `a[0] + 2`。 * 这是一个**整数值**的计算结果,既不是地址,也不是对某个特定数组元素的直接引用(除非巧合)。它不符合“引用数组元素”或“引用地址”的典型语义。 * **C. `*(a+2)`** * 在 C 语言中,数组名 `a` 在大多数表达式中代表数组首元素的地址(即 `&a[0]`)。 * `a+2` 表示从首地址向后偏移 2 个 `int` 单位,即指向 `a[2]` 的**地址**(等价于 `&a[2]`)。 * `*(a+2)` 对该地址进行解引用,得到的是 `a[2]` 的**值**。 * **关键点辨析**: * 如果题目问的是“**元素值**的正确引用”,那么 `*(a+2)` 是完全正确的,它等价于 `a[2]`。 * 如果题目问的是“**元素地址**的正确引用”,那么正确答案应该是 `a+2` 或 `&a[2]`,而不应该带 `*`。 * **然而**,观察所有选项: * A: `*(p+5)` -> 越界取值 * B: `*p+2` -> 值加2 * C: `*(a+2)` -> 合法取值 * D: `*&a[5]` -> 越界 * 在这四个选项中,只有 **C** 是对一个**合法存在的数组元素**进行的正确操作(尽管它获取的是值)。 * **重新审视题目文字**:“对a数组元素地址的正确引用”。这在很多老旧题库中是一个常见的表述不严谨的情况。实际上,出题人往往想考察的是 `a+i` 和 `*(a+i)` 的区别,或者混淆了“引用元素”和“引用地址”。 * **另一种可能性**:题目其实想问的是“**对 a 数组元素的正确引用**”(漏掉了“值”字,或者“地址”二字是误导/错误)。在这种情况下,C 是唯一合法的、未越界的元素访问方式。 * **再看一种解释**:有些教材会将 `*(a+2)` 这种通过指针运算访问元素的方式,广义地称为对元素的“引用”(Reference),而不管它是取址还是取值。相比之下,A 和 D 都涉及 `a[5]` 越界,B 是算术运算。因此 C 是“最正确”的选项。 * **D. `*&a[5]`** * `a[5]` 同样**越界**。 * `&a[5]` 取越界位置的地址。 * `*&a[5]` 等价于 `a[5]`,即访问越界内存的值。 * 这是非法的(或未定义行为),因为下标 5 超出了 `int a[5]` 的范围。 ### 3. 结论推导 1. **排除法**: * 数组 `a[5]` 的下标范围是 `0, 1, 2, 3, 4`。 * 选项 A 涉及 `p+5` (即 `a[5]`),越界。 * 选项 D 涉及 `a[5]`,越界。 * 因此 A 和 D 肯定错误。 2. **比较 B 和 C**: * 选项 B `*p+2` 是先取值再加法,结果是 `a[0]+2`,这并没有引用 `a[2]` 或其他特定元素,只是做了一个数学运算。 * 选项 C `*(a+2)` 等价于 `a[2]`,它正确地引用了数组中的第 3 个元素。 3. **关于题目表述“地址”的矛盾**: * 严格来说,`*(a+2)` 得到的是**值**,`a+2` 得到的才是**地址**。 * 但是,鉴于 A、D 越界,B 语义不符,**C 是唯一语法正确且访问了合法数组元素的选项**。 * 在很多计算机二级或期末考试题库中,这类题目常出现表述瑕疵。如果必须选一个“正确引用”,通常指“合法访问”。 * *修正视角*:有没有可能题目问的是“**值**”?如果是“对 a 数组元素**值**的正确引用”,那么 C 完美符合。考虑到 A、D 的越界错误非常明显,C 是标准答案的可能性极大,即便题目文字写了“地址”,这很可能是题目印刷错误,应将“地址”理解为“元素”或“值”。 **补充说明**:如果题目严格问“地址”,没有任何一个选项是完全标准的“地址表示”(如 `a+2` 或 `&a[2]`)。但 `*(a+2)` 是基于地址运算 `a+2` 后的解引用。在某些语境下,出题人可能混淆了概念。但在单选题中,**C 是唯一不涉及越界且符合指针/数组运算规则的选项**。 ### 最终答案 **C** **解析总结:** * 数组 `a` 大小为 5,合法下标为 0-4。 * A 项 `*(p+5)` 和 D 项 `*&a[5]` 均访问了下标为 5 的元素,属于**数组越界**,错误。 * B 项 `*p+2` 等价于 `a[0]+2`,是一个数值表达式,并非对数组中某个特定元素的引用,错误。 * C 项 `*(a+2)` 等价于 `a[2]`,是对数组中合法元素 `a[2]` 的正确引用(取值)。尽管题目问的是“地址”,但在给出的选项中,只有 C 是对合法元素的正确操作形式(通常此类题目意在考察 `*(a+i)` 与 `a[i]` 的等价性及边界检查)。
题目纠错
c语言选择判断题库

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

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