为什么这里scanf后面接的不是rect.width而是使用->
见标题 这里使用 &rect->width 而不是 rect.width,是因为 scanf 函数需要传入参数的地址,而不是参数本身。rect 是一个指针,指向一个结构体,所以我们需要使用 -> 运算符来访问结构体中的成员。
在 C 语言中,当我们想要修改一个变量的值时,我们需要传递该变量的地址。
scanf 函数需要知道你要修改的变量的地址,以便在读取到输入时将值写入到指定的内存地址中。& 运算符用于获取变量的地址。
由于 rect 是一个指向结构体的指针,我们使用 -> 运算符来访问它的成员。所以 rect->width 表示访问 rect 指向的结构体中的 width 成员。
然后我们使用 & 运算符获取 width 成员的地址,并将其传递给 scanf 函数。这样,scanf 函数就可以将输入的值存储在 rect->width 的内存地址中。
当你想要使用 . 运算符替代 ->,需要先将指针转换为结构体类型。你可以通过解引用指针来实现这一点。
下面是一个示例:
#include <stdio.h>
typedef struct {
int width;
int height;
} Rectangle;
int main() {
Rectangle my_rect;
Rectangle *rect = &my_rect; // 将 my_rect 的地址赋值给指针 rect
// 使用 . 运算符而不是 ->,需要先解引用指针
scanf("%d", &( *rect).width);
scanf("%d", &( *rect).height);
printf("Width: %d\n", my_rect.width);
printf("Height: %d\n", my_rect.height);
return 0;
}
在这个示例中,我们首先创建了一个 Rectangle 结构体实例 my_rect,然后将其地址赋值给指针 rect。
接下来,我们使用解引用操作符 * 获取指向的结构体实例。这样我们就可以使用 . 运算符来访问结构体中的成员。
需要注意的是,(*rect).width 的括号是必要的,因为 . 运算符的优先级高于 * 运算符。
所以,我们需要使用括号来确保先对指针进行解引用操作,然后再访问结构体中的成员。
在这个示例中,我们先通过 (*rect) 解引用指针,得到 my_rect 结构体实例,然后再使用 . 运算符来访问其 width 和 height 成员。
// 使用 . 运算符而不是 ->,需要先解引用指针
scanf("%d", &( *rect).width);
scanf("%d", &( *rect).height);
不过,通常情况下,当我们在处理指向结构体的指针时,还是推荐使用 -> 运算符,因为它更加简洁,易于理解。
使用解引用和 . 运算符的方法虽然也能达到目的,但相对繁琐。在实际编程过程中,通常会根据情况选择合适的方法。
页:
[1]