Victorziyou 发表于 2023-4-4 12:40:25

为什么这里scanf后面接的不是rect.width而是使用->

见标题

isdkz 发表于 2023-4-4 12:48:04

这里使用 &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]
查看完整版本: 为什么这里scanf后面接的不是rect.width而是使用->