单选题
1、〖第16题〗202) 设有如下定义: struct sk {int a; float b;} data,*p;
A
p=(struct sk*)&data.a;
B
p=(struct sk*) data.a;
C
p=&data.a;
D
*p=data.a;
答案解析
正确答案:A
解析:
这是一道关于 C 语言中结构体指针赋值的题目。我们需要分析每个选项,看哪个能正确地将指针 `p` 指向结构体变量 `data` 或者其成员,且符合语法和类型要求。
**1. 题目分析**
* **定义**: `struct sk {int a; float b;} data, *p;`
* `struct sk` 是一个结构体类型,包含一个整型成员 `a` 和一个浮点型成员 `b`。
* `data` 是该结构体类型的一个实例(变量)。
* `p` 是一个指向 `struct sk` 类型的指针变量 (`struct sk *`)。
* **目标**: 找出合法的赋值语句,通常这类题目考察的是如何让指针 `p` 正确地指向 `data` 或者通过某种方式让 `p` 获得合法的地址值。虽然题目没有明确说“让 p 指向 data”,但根据选项 A 的答案提示,考察点在于**类型转换**和**地址获取**。
**2. 选项逐一解析**
* **A. `p=(struct sk*)&data.a;`**
* `data.a` 是结构体 `data` 的第一个成员(`int` 类型)。
* `&data.a` 取出了成员 `a` 的地址,其类型是 `int *`。
* `(struct sk *)` 是强制类型转换,将 `int *` 类型的地址转换为 `struct sk *` 类型。
* 在 C 语言中,结构体的第一个成员的地址通常与结构体本身的起始地址相同(忽略填充的情况下,或者说指针指向同一内存起点)。因此,将 `&data.a` 强制转换为 `struct sk *` 并赋值给 `p`,使得 `p` 指向了 `data` 的起始位置。
* **语法上**:这是合法的。左边是 `struct sk *`,右边经过强制转换后也是 `struct sk *`。
* **逻辑上**:这是一种常见的技巧,用于通过成员地址反推结构体地址(尽管标准做法是用 `&data`)。在此题语境下,它是唯一语法正确且类型匹配的赋值操作。
* **B. `p=(struct sk*) data.a;`**
* `data.a` 是一个 `int` 类型的值(例如 0, 1, 10 等)。
* `(struct sk *)` 试图将这个整数值直接转换为指针地址。
* 虽然语法上可能通过编译(取决于编译器警告级别),但这通常是将一个整数当作内存地址使用,极易导致非法内存访问(Segmentation Fault),除非 `data.a` 恰好存储了一个有效的内存地址。这不是常规的指针赋值方式,且语义上不合理。更重要的是,在大多数标准考试语境中,将非地址的整数值直接强转为指针被视为错误或不安全的操作,不如 A 选项严谨。
* **C. `p=&data.a;`**
* `&data.a` 的类型是 `int *`。
* `p` 的类型是 `struct sk *`。
* C 语言中,不同类型的指针之间不能直接赋值(除了 `void *`)。`int *` 不能直接赋值给 `struct sk *`,编译器会报错(类型不兼容)。
* **错误原因**:类型不匹配,缺少强制类型转换。
* **D. `*p=data.a;`**
* `*p` 表示解引用指针 `p`,其类型是 `struct sk`(结构体整体)。
* `data.a` 的类型是 `int`。
* 试图将一个 `int` 值赋值给一个 `struct sk` 类型的变量,类型完全不匹配,编译器会报错。
* 此外,此时 `p` 尚未初始化,解引用未初始化的指针会导致未定义行为(崩溃)。
* **错误原因**:类型不匹配 + 未初始化指针解引用。
**3. 总结**
* 选项 C 和 D 存在明显的类型错误,编译无法通过。
* 选项 B 将整数值作为地址,虽可能编译但逻辑危险且非标准用法。
* 选项 A 使用了强制类型转换,将结构体第一个成员的地址(`int *`)转换为结构体指针(`struct sk *`),语法正确,且在内存布局上,指向第一个成员的指针经转换后可以合法地指向整个结构体(前提是访问时注意对齐和边界,但在指针赋值层面是合法的)。
因此,最合适的选项是 **A**。
**答案:A**
题目纠错
c语言选择判断题库
相关题目
单选题
9.以下数组定义中不正确的是()。
单选题
8.设有 int x=11; 则表达式 (x++ * 1/3) 的值是()。
单选题
3.以下数据中,不正确的数值或字符常量是()。
单选题
1、第300题 (1.0分) 题号:516 static char str[10]=“China”;数组元素个数为()。
单选题
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 下列定义数组的语句中正确的是()。
