鱼C论坛

 找回密码
 立即注册
查看: 1085|回复: 1

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

[复制链接]
发表于 2023-4-4 12:40:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
见标题
最佳答案
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);

不过,通常情况下,当我们在处理指向结构体的指针时,还是推荐使用 -> 运算符,因为它更加简洁,易于理解。

使用解引用和 . 运算符的方法虽然也能达到目的,但相对繁琐。在实际编程过程中,通常会根据情况选择合适的方法。
329f6f98383e52433059a53a0d69b81.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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);

不过,通常情况下,当我们在处理指向结构体的指针时,还是推荐使用 -> 运算符,因为它更加简洁,易于理解。

使用解引用和 . 运算符的方法虽然也能达到目的,但相对繁琐。在实际编程过程中,通常会根据情况选择合适的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-17 08:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表