从结构中返回值

use*_*466 2 c

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);

}
Run Code Online (Sandbox Code Playgroud)

在fooV调用中,创建局部变量值...因此调用者中的数据不会更新但是如果我想从fooV返回值呢?我该怎么加入fooV?谢谢

aib*_*aib 10

你需要通过引用传递v in ,这是使用C中的指针完成的:

void fooV(Value* v)
{
    (*v).id = 10;
    (*v).type = 'L';
    (*v).a = 'R';
}
Run Code Online (Sandbox Code Playgroud)

或者使用 - >简写操作符:

void fooV(Value* v)
{
    v->id = 10;
    v->type = 'L';
    v->a = 'R';
}
Run Code Online (Sandbox Code Playgroud)

不要忘记通过v的地址:

fooV(&v);
Run Code Online (Sandbox Code Playgroud)


Jam*_*lis 5

如果您只想拥有一个fooV返回"构造" Value结构的函数,可以fooV按如下方式重写:

Value fooV() {
    Value v;
    v.id = 10;
    v.type = 'L';
    v.a = 'R';
    return v;
}
Run Code Online (Sandbox Code Playgroud)

你会称这个函数为:

Value v = fooV();
Run Code Online (Sandbox Code Playgroud)

否则,如果您需要一个修改Value已有结构的函数,则有两个选项:您需要更改返回类型fooV:

Value fooV(Value v){
    v.id = 10;
    v.type = 'L';
    v.a = 'R';
    return v;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你会称之为:

v = fooV(v);
Run Code Online (Sandbox Code Playgroud)

或更改fooV以接受指向以下内容的指针Value:

void fooV(Value* v){
    v->id = 10;
    v->type = 'L';
    v->a = 'R';
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你会称之为:

fooV(&v);
Run Code Online (Sandbox Code Playgroud)