单选题
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语言选择判断题库
相关题目
单选题
1、第299题 (1.0分) 题号:664 以下正确的函数定义形式是()。
单选题
1、第298题 (1.0分) 题号:537 在定义构造数据类型时,不能()。
单选题
1、第297题 (1.0分) 题号:525 C语言中不可以嵌套的是()。
单选题
1、第296题 (1.0分) 题号:626 若希望当A的值为奇数时,表达式的值为”真”,A的值为偶数时,表达 式的值为”假”,则以下不能满足要求的表达式是()。
单选题
1、第295题 (1.0分) 题号:96 下列字符序列中,不可用作C语言标识符的是()。
单选题
1、第294题 (1.0分) 题号:165 下列定义数组的语句中正确的是()。
单选题
1、第293题 (1.0分) 题号:685 在位运算中,操作数每左移一位,其结果相当于()。
单选题
1、第292题 (1.0分) 题号:529 在C语言中,调用函数除函数名外,还必须有()。
单选题
1、第291题 (1.0分) 题号:574 若变量已正确定义并赋值,下面符合C语言语法的表达式是()。
单选题
1、第290题 (1.0分) 题号:563 以下叙述中正确的是()。
