设有如下定义:
struck sk { int a; float b; }data; int *p;
若要使P指向data中的a域,正确的赋值语句是( )
A) p=&a; B) p=data.a; C) p=&data.a; D)*p=data.a;
正确的赋值语句是 **C) p=&data.a;**。
解释如下: - `p` 是一个指向 `int` 的指针。 - `data` 是 `struck` 类型的变量,它包含一个 `int` 类型的成员 `a` 和一个 `float` 类型的成员 `b`。 - 要使指针 `p` 指向 `data` 中的 `a` 域,需要将 `p` 设置为 `data.a` 的地址,即 `&data.a`。
选项说明: - A) `p=&a;` 这个语句是不合法的,因为 `a` 没有被定义为全局变量或者没有在同一个作用域内,所以不能这样赋值。 - B) `p=data.a;` 这个语句将 `data.a` 的值赋给了 `p`,但是 `p` 是一个指针,所以不能直接赋值一个 `int` 类型的值。 - C) `p=&data.a;` 这是正确的赋值语句,它将 `data.a` 的地址赋给了指针 `p`。 - D) `*p=data.a;` 这个语句试图将 `data.a` 的值赋给 `p` 指向的内存地址,但是此时 `p` 还没有被初始化指向一个有效的内存地址,所以这个操作是不安全的,可能导致未定义行为。
因此,正确的选项是 C。
data是一结构体变量,a是它的成员,因此引用a域的正确方法是:data.a,取它的地址赋值给指针变量p的语句应该是:p=&data.a。选项A将a的地址直接赋给了p,而忽略了a为结构体内部的一个成员,不是一单独的变量,故选项A不正确;选项B在p=data.a表达式中右边为一个结构体变量的成员不是地址,而左边为一指针应该将一地址赋给它,故选项B不正确。选项D表达式*p=data.a是将结构体变量中的成员a的值赋给指针p所指向的变量值,而不是使指针p指向data中的a域,故选项D不正确。
yzyadmin 回复 qsanjin: 膜拜 大佬
C和D不是等价的吗
ims 回复 llllleonardo: 不等价呢!D的指针没有初始化,然后你强制赋值,就是野指针错误。C的话,就是用a字段的地址来初始化p指针的,是合法操作。
ZzwZzw 回复 llllleonardo: 应该是int *p=data.a是合法的吧
imxumaomao 回复 ZzwZzw: 不合法,p都没有初始化
Sjr2002 回复 llllleonardo: 合法,指针可以定义时初始化
C
用户登录可进行刷题及查看答案
登录后提交答案