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

1、第244题 (1.0分) 题号:205 变量p为指针变量,若p=&a,下列说法不正确的是()。

A
 &*p==&a
B
 *&a==a
C
 (*p)++==a++
D
 *(p++)==a++

答案解析

正确答案:D

解析:

这是一道关于 C 语言指针运算和表达式求值的经典题目。我们需要根据已知条件 `p = &a`(即指针 `p` 指向变量 `a`),逐一分析各个选项的正确性。 **核心知识点:** 1. `&` 是取地址运算符。 2. `*` 是解引用(间接访问)运算符。 3. `++` 是自增运算符,分为前置(`++i`)和后置(`i++`)。 4. 运算符优先级:后缀自增 `++` > 解引用 `*` / 取地址 `&`。 5. 表达式的“值”与“副作用”的区别。 --- ### 逐项解析: **A. `&*p == &a`** * **分析**: * `*p`:因为 `p` 指向 `a`,所以 `*p` 等价于变量 `a本身`。 * `&*p`:对 `*p`(即 `a`)取地址,等价于 `&a`。 * 因此,`&*p` 的值就是 `a` 的地址,即 `&a`。 * 等式变为 `&a == &a`,显然成立。 * **结论**:说法正确。 **B. `*&a == a`** * **分析**: * `&a`:获取变量 `a` 的地址。 * `*&a`:对 `a` 的地址进行解引用,也就是访问该地址存储的值,结果等价于 `a`。 * 等式变为 `a == a`,显然成立。 * **结论**:说法正确。 **C. `(*p)++ == a++`** * **分析**: * `(*p)`:括号强制先解引用,`*p` 等价于变量 `a`。 * `(*p)++`:等价于 `a++`。这是一个后置自增表达式。 * **表达式的值**:后置自增表达式的值是**自增前**的值。 * **副作用**:执行后,`a`(以及 `*p` 指向的内容)的值都会加 1。 * 左边 `(*p)++` 的值是 `a` 原来的值;右边 `a++` 的值也是 `a` 原来的值。 * 两者相等。 * **结论**:说法正确。 **D. `*(p++) == a++`** * **分析**:这是本题的关键陷阱,涉及**运算符优先级**和**指针移动**。 * **左边 `*(p++)`**: 1. `p++` 是后置自增。根据优先级,后缀 `++` 高于 `*`。 2. `p++` 这个表达式的**值**是 `p` 自增前的值(即当前指向 `a` 的地址)。 3. `*` 作用于这个“旧地址”,所以 `*(p++)` 取出的是 `a` 当前的值。 4. **副作用**:执行完该表达式后,指针 `p` 会向后移动一个单位(指向下一个内存位置,不再指向 `a`)。 * **右边 `a++`**: 1. 这是变量 `a` 的后置自增。 2. 表达式的**值**是 `a` 自增前的值。 3. **副作用**:执行后,变量 `a` 的值加 1。 * **比较**: * 虽然在数值上,如果仅看“表达式的返回值”,左边取的是 `a` 的旧值,右边也是 `a` 的旧值,看似相等。 * **但是**,这道题考察的是语意等价性或潜在的错误理解。更深层的问题在于: 1. **侧重点不同**:`*(p++)` 的主要副作用是**改变指针 p 的指向**,而 `a++` 的副作用是**改变变量 a 的值**。 2. **严格来说**:如果在同一个完整表达式中比较它们(如 `if (*(p++) == a++)`),虽然返回值可能相同,但这两个操作产生的**状态改变完全不同**。 3. **最关键的错误点**:通常这类题目中,D 选项被视为不正确,是因为它暗示了 `*(p++)` 和 `a++` 是完全等价的替代关系。然而,`*(p++)` 执行后,`p` 不再指向 `a`,后续再通过 `p` 访问 `a` 就会出错;而 `a++` 执行后,`a` 的值变了,但如果有其他指针指向 `a`,那些指针依然有效。 4. **另一种常见的考点解释**:有些教材或语境下,认为 `*(p++)` 取值后,`p` 移走了,而 `a++` 只是值变化。如果题目隐含意思是“这两个表达式在任何上下文中都可以互换”,那显然是错的。 5. **更直接的逻辑漏洞**:让我们仔细看 C 和 D 的区别。 * C 选项:`(*p)++` 修改的是 `p` 指向的**内容**(即 `a` 的值),`p` 本身不变。这与 `a++` 行为完全一致(都改值,都不动指针/变量身份)。 * D 选项:`*(p++)` 修改的是 **`p` 指针本身**(让它指向别处),取值只是副产物。而 `a++` 修改的是 **`a` 的值**。 * 因此,说 `*(p++)` 等价于 `a++` 是**不正确**的,因为它们的**副作用(Side Effect)**完全不同。一个是动指针,一个是动数据。 * **结论**:说法不正确。 ### 总结 * A、B 考查指针与地址的基本互逆运算,正确。 * C 考查通过指针修改所指变量的值,`(*p)++` 等同于 `a++`,正确。 * D 考查指针自增与变量自增的区别。`*(p++)` 会让指针偏移,而 `a++` 不会改变任何指针的指向。两者的语义和副作用不同,不能划等号。 因此,不正确的说法是 **D**。
题目纠错
c语言选择判断题库

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

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