这两种结构用法之间的区别

时间:2019-05-21 07:56:25

标签: c arrays struct

在函数中使用结构时,我提供了两种将其作为参数传递的方法,但我不知道哪种方法更好。

#include <stdio.h>

typedef struct Person{
    int age;
    int id;
} person;

static void foo(person *p1);

int main()
{
    person per1;
    person per2[1];

    foo(&per1); /*1*/
    foo(per2); /*2*/

    printf("per1. Age: %i; id: %i\n",per1.age,per1.id);
    printf("per2. Age: %i; id: %i\n",per2->age,per2->id);

    return 0;
}
static void foo(person *p1)
{
    p1->age=10;
    p1->id=123;
}

该用例仅用于结构的一个实例。如果只需要一个,就性能和使用感而言,传递通用结构声明的地址,或传递将衰减到指针的结构的单一数组,哪个更好?

2 个答案:

答案 0 :(得分:8)

任何情况下,任何现代编译器都将生成相同的机器代码,因此无需担心性能。 (See Godbolt)。

由于没有性能差异,请以最能表达您意图的方式进行操作。您的意图是拥有一个对象,并将该对象的地址传递给函数。因此,只需执行此操作(即您的第一选择)。无缘无故地创建1元素数组只会使事情变得混乱。

答案 1 :(得分:1)

两个都是正确的。哪个更好取决于您的需求。

per1的类型为person(在残缺中是struct Person的typedef),因此,如果要传递它,则传递它的地址(就像使用{ {1}}运算符)。

&是一个per2的数组,因此它的类型实际上是一个 address 数组,这就是您可以原样传递它的原因。如果不需要数组person,请使用第一个选项。