C 从结构返回值
在fooV调用中,将创建局部变量值。。。 因此,不会更新调用方中的任何数据C 从结构返回值,c,C,在fooV调用中,将创建局部变量值。。。 因此,不会更新调用方中的任何数据 但是如果我想从fooV返回值呢?我应该向fooV添加什么?谢谢如果您只想拥有一个返回“构造的”值结构的fooV函数,您可以按如下方式重写fooV: typedef struct Value{ int id; char type; char a; } Value; void fooV(Value v){ v.id = 10; v.type = 'L'; v.a = 'R';
但是如果我想从fooV返回值呢?我应该向fooV添加什么?谢谢如果您只想拥有一个返回“构造的”
值
结构的fooV
函数,您可以按如下方式重写fooV
:
typedef struct Value{
int id;
char type;
char a;
} Value;
void fooV(Value v){
v.id = 10;
v.type = 'L';
v.a = 'R';
}
int main(void){
Value v;
Pointer p;
int id = 5;
char type = 't';
char a = 'a';
printf("id: %d, type: %c, a: %c \n",id,type,a);
v.a = a;
v.id = id;
v.type = type;
fooV(v);
printf("id: %d, type: %c, a: %c \n",id,type,a);
}
你可以这样调用这个函数:
Value fooV() {
Value v;
v.id = 10;
v.type = 'L';
v.a = 'R';
return v;
}
否则,如果您需要修改已有的值
结构的函数,则有两个选项:您需要更改fooV的返回类型:
Value v = fooV();
在这种情况下,您可以这样称呼它:
Value fooV(Value v){
v.id = 10;
v.type = 'L';
v.a = 'R';
return v;
}
void fooV(Value* v){
v->id = 10;
v->type = 'L';
v->a = 'R';
}
或者将fooV更改为接受指向值的指针
:
v = fooV(v);
在这种情况下,您可以这样称呼它:
Value fooV(Value v){
v.id = 10;
v.type = 'L';
v.a = 'R';
return v;
}
void fooV(Value* v){
v->id = 10;
v->type = 'L';
v->a = 'R';
}
您需要通过引用传递v,这是使用C中的指针完成的:
fooV(&v);
或使用->速记操作符:
void fooV(Value* v)
{
(*v).id = 10;
(*v).type = 'L';
(*v).a = 'R';
}
别忘了传递v的地址:
void fooV(Value* v)
{
v->id = 10;
v->type = 'L';
v->a = 'R';
}
并将第二个printf更改为使用v的值,而不是变量id、type、a
fooV(&v);
或者,您可以从fooV()
:值fooV(值v)返回值结构代码>虽然它可能效率较低。我让它工作了!!!!但是你能解释一下(*v).id=10;和*(v)。id=10;出于某种原因,我认为它们是相同的…@metashockwave:运算符“.”的优先级高于运算符“”,因此“*(v.id”和“*v.id”都将被解释为“*(v.id)”。要获得预期的含义,即首先使用“”跟随指针,然后在结构中获取“id”字段,您需要写入“(*v).id”或“v->id”。注意:与C中的所有其他内容一样,结构也是通过值传递的。结构的值可能非常大(就结构的大小而言),因此向结构传递指针是一个好习惯。您的第一个示例不会在堆栈上创建值v吗?这可能会有一些非常严重的副作用…@Robert:是的,v
存在于堆栈中。不过,我不明白这有什么关系,因为v
只有在函数结束时才存在,而且函数中没有指向v
的指针或引用泄漏,因此一旦函数返回,就无法访问它。是的,我的错。我最近写了太多Java:)