2016-08-24 131 views
-4

我无法理解所发生的情况。第二个标记的值是一些随机数而不是1.为什么第二个标记的值不是函数中的值?函数返回值与预期不同

struct player 
{ 
char name[20]; 
enum cell token; 
unsigned score; 
}; 


BOOLEAN init_player2(struct player *second, enum cell token) 
{ 
    token = 1; 
} 

int main() 
{ 
    struct player second; 
    init_player2(&second, second.token); 
    printf("The value of second token is: %d\n", second.token); 

    return 0; 
} 
+2

'token = 1;'对'second.token'没有影响。你想'second-> token = 1;'(第二个参数是多余的)。 – Michael

+0

此外,我没有看到任何需要传递第二个参数! – CinCout

+0

这个人肯定有几十个傻瓜,@CBegin你应该先从**搜索**开始,然后再问自己。 – fvu

回答

4

C为函数参数传递使用传递值。

在你的代码中,second.token是按值传递的,所以在函数内对它做的任何修改都不会反映给调用者。

你期待什么,是下面的代码

void change(int x) 
{ 
     x = 10; 
} 

int main(void) 
{ 
    int p = 5; 
    change(p); 
    printf("%d\n", p); 
    return 0; 
} 

打印10,这简直是不可能的。 (如果你打这个电话作为change(15);想象中的恐怖

解决方案:

你并不需要单独通过的第二个参数。您已经将指针传递给包含enum变量的结构,只需使用指针更改被调用函数中的值,然后在调用方中打印结构变量的枚举成员的值即可。

+1

作为dup的被接受的答案状态:C不会做通过引用。它严格按照价值传递。关于常量:Python严格按照引用传递,但仍然可以将文字传递给函数。它就像一个魅力。没有恐怖! – Olaf

0
struct player 
{ 
char name[20]; 
enum cell token; 
unsigned score; 
}; 


BOOLEAN init_player2(struct player *second, enum cell token) 
{ 
    second->token= 1; 
} 

int main() 
{ 
    struct player second; 
    init_player2(&second, second.token); 
    printf("The value of second token is: %d\n", second.token); 

    return 0; 
} 

你只需要在函数内部使用指针来改变结构的值。

+0

传递第二个参数有什么用? – CinCout