在函数中使用结构时,我提供了两种将其作为参数传递的方法,但我不知道哪种方法更好。
#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;
}
该用例仅用于结构的一个实例。如果只需要一个,就性能和使用感而言,传递通用结构声明的地址,或传递将衰减到指针的结构的单一数组,哪个更好?
答案 0 :(得分:8)
任何情况下,任何现代编译器都将生成相同的机器代码,因此无需担心性能。 (See Godbolt)。
由于没有性能差异,请以最能表达您意图的方式进行操作。您的意图是拥有一个对象,并将该对象的地址传递给函数。因此,只需执行此操作(即您的第一选择)。无缘无故地创建1元素数组只会使事情变得混乱。
答案 1 :(得分:1)
两个都是正确的。哪个更好取决于您的需求。
per1
的类型为person
(在残缺中是struct Person
的typedef),因此,如果要传递它,则传递它的地址(就像使用{ {1}}运算符)。
&
是一个per2
的数组,因此它的类型实际上是一个 address 数组,这就是您可以原样传递它的原因。如果不需要数组person
,请使用第一个选项。