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

1、第29题 (1.0分) 题号:202 设有如下定义: struct sk {int a; float b;} data,*p; 若要使p指向data中的a域,正确的赋值语句是()。

A
 p=(struct sk*)&data.a;
B
 p=(struct sk*) data.a;
C
 p=&data.a;
D
 *p=data.a;

答案解析

正确答案:A

解析:

**解析:** 1. **分析变量定义与类型:** * `struct sk {int a; float b;} data, *p;` * `data` 是一个结构体变量,类型为 `struct sk`。 * `p` 是一个结构体指针变量,类型为 `struct sk *`,即它只能指向一个完整的 `struct sk` 类型的结构体变量。 * `data.a` 是结构体 `data` 中的成员,类型为 `int`。 * `&data.a` 是成员 `a` 的地址,类型为 `int *`。 2. **分析题目要求:** * 题目要求“使 p 指向 data 中的 a 域”。 * 从严格的 C 语言类型系统来看,`p` 是 `struct sk *` 类型,而 `&data.a` 是 `int *` 类型。直接赋值 `p = &data.a` 会导致类型不匹配错误( incompatible pointer types)。 * 但是,在内存布局中,结构体的第一个成员的地址通常与结构体变量的起始地址相同(在没有填充字节的情况下,或者即使有填充,首地址也是对齐的)。因此,`&data.a` 的值(地址数值)等于 `&data` 的值。 * 为了让编译器接受将 `int *` 类型的地址赋值给 `struct sk *` 类型的指针,需要进行**强制类型转换**。 3. **逐项分析选项:** * **A. `p=(struct sk*)&data.a;`** * `&data.a` 取出成员 `a` 的地址,类型为 `int *`。 * `(struct sk *)` 将该地址强制转换为 `struct sk *` 类型。 * 最后赋值给 `p`。虽然这在逻辑上有点奇怪(通常我们让 `p` 指向整个结构体 `p = &data`),但这是唯一能通过编译并实现“让 p 存储 a 的地址(解释为结构体指针)”语法的选项。由于 `a` 是第一个成员,`&data.a` 和 `&data` 指向同一内存位置。此选项通过强制类型转换解决了类型不匹配问题,是本题语境下的正确答案。 * **B. `p=(struct sk*) data.a;`** * `data.a` 是一个 `int` 值(例如 0 或其他整数)。 * 这将整数值强制转换为指针地址。除非 `data.a` 的值恰好是一个合法的内存地址,否则这会导致程序崩溃或未定义行为。而且语义上完全错误,不是取地址。 * **C. `p=&data.a;`** * `&data.a` 的类型是 `int *`。 * `p` 的类型是 `struct sk *`。 * C 语言中,不同类型的指针之间不能直接赋值(除了 `void *`)。编译器会报错或发出警告(error: assignment from incompatible pointer type)。因此不正确。 * **D. `*p=data.a;`** * 首先,`p` 尚未初始化,指向未知内存,解引用 `*p` 是非法操作(段错误)。 * 其次,`*p` 代表一个 `struct sk` 结构体对象,而 `data.a` 是一个 `int`。结构体不能直接赋值为一个整数。类型不匹配且逻辑错误。 4. **结论:** 要使指针 `p`(类型为 `struct sk *`)获得 `data.a` 的地址,必须对 `&data.a`(类型为 `int *`)进行强制类型转换,将其转换为 `struct sk *` 类型。因此,选项 A 是正确的语法形式。 *(注:在实际编程规范中,通常建议 `p = &data;` 来让 p 指向整个结构体,然后通过 `p->a` 访问成员。但针对本题特定的考察点——指针类型转换和地址关系,A 是唯一符合语法规则的选项。)* **答案:A**
题目纠错
c语言选择判断题库

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

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