为什么使用指向结构的指针而不直接使用结构(C)

hod*_*ddy 5 c pointers

我在下面的代码中显示了两个示例,它们给出了相同的结果。我看到人们使用指针来执行示例 1。但为什么不直接使用示例 2 并使用斧头呢?有什么区别吗?

typedef struct
{
    uint8_t x;
    uint8_t y;
    uint8_t z;
} xyz_t;

xyz_t a;

void func1(xyz_t* b)
{
    printf("%d", b->x); //example 1
}

void func2()
{
    printf("%d", a.x); //example 2
}

int main()
{
    a.x = 10;
    func1(&a); //example 1
    func2();   //example 2
}
Run Code Online (Sandbox Code Playgroud)

小智 5

为了直接回答你的问题,就好像我问你“为什么我要把一个变量作为参数传递给我的函数,而不是仅仅将它保留为全局变量?”,但这可能不是你正在寻找的答案,以下是关于为什么指针在这种情况下有用的更多见解:

指针很有用,因为您可以更轻松地“移动它们”。您不必每次都复制整个结构,只需将其保留在内存中,然后传递一个指向它的指针即可。

此外,传递指针意味着您可以修改“a”而无需将其复制回来,因为该结构仅驻留在内存中的一个位置。

我可能掩盖了更多原因,但我认为这些是最重要的,并且与您原来的问题最相关。

祝你今天过得愉快!


Hen*_*rre 3

如果您的函数作为参数给出了没有指针的结构,则必须复制其数据才能供函数使用,这可能需要一些时间。此外,如果您想修改函数中的结构并在函数作用域之外查看其更改,则唯一的选择是通过指针发送它,因为您为函数提供了要修改的变量在内存中的位置,而不是(本地)副本。如果变量不大并且您不修改它们,通常首选按值发送变量,因为它使调用者更清楚函数对其参数的操作。如果你的函数只能对单个变量进行操作,那么它的用途将非常有限。例如,您可以将同一函数与该函数无法直接访问的另一个 xyz_t 一起使用。