c - 调用者看不到函数中的变量更改?

标签 c variables pass-by-value

是的,我知道这听起来很傻,但我不知道我做错了什么!

该函数是扑克游戏的一部分,其中有 10 个函数,每个函数检查特定的扑克手牌。如果激活,该函数将打印“玩家 1 有一个完整的房子!”这一行。或者不管是什么手。但是,我还需要增加 p1 的值,其中 p1 是一个全局变量,它保存了 p1 的总分。

打印该行效果很好,但是当我想分配一个值 10 给 p1 时,它根本不分配。

在下面的例子中,printfs 在它们应该工作的时候完美地工作,但是 px 没有分配。我什至在每个函数之后立即打印 px 的值,但它仍然打印 0。

void checkForPoker(int j, int px) //j is the player's number, px is the player's scoreholder
{
    if ((c1==c2 && c2==c3 && c3==c4) || (c1==c2 && c2==c3 && c3==c5) || (c1==c2 && c2==c4 && c4==c5) || (c1==c3 && c3==c4 && c4==c5))
    {
        printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c1));
        px = 8;
    }
    if (c5==c2 && c2==c3 && c3==c4)
    {
        printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c2));
        px = 8;
    }
}

最佳答案

您传递的参数是“按值”,而不是“按引用”。这意味着一旦将 px 传递给函数,您就在函数内部拥有它的副本,因此函数内部的任何修改都不会影响原始 px

被调用者

试试这个(看看我们现在将参数作为指针传递给函数):

void checkForPoker(int j, int* px) //j is the player's number, px is the player's scoreholder
{
    if ((c1==c2 && c2==c3 && c3==c4) || (c1==c2 && c2==c3 && c3==c5) || (c1==c2 && c2==c4 && c4==c5) || (c1==c3 && c3==c4 && c4==c5))
    {
        printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c1));
        *px = 8;
    }
    if (c5==c2 && c2==c3 && c3==c4)
    {
        printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c2));
        *px = 8;
    }
}

来电者

这也意味着调用代码发生了变化。您必须将地址传递给整数,而不是传递整数,例如:

代替

int a = 2;
checkForPoker(2, a);

您将必须执行以下操作:

int a = 2;
checkForPoker(2, &a);

替代方式

根据 SO 用户 (Charlon) 的建议,您可以选择另一种方法,避免使用指针:您可以使用 px 作为函数的返回值:

int checkForPoker(int j) //j is the player's number
{
    int px = 0;
    if ((c1==c2 && c2==c3 && c3==c4) || (c1==c2 && c2==c3 && c3==c5) || (c1==c2 && c2==c4 && c4==c5) || (c1==c3 && c3==c4 && c4==c5))
    {
        printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c1));
        px = 8;
    }
    if (c5==c2 && c2==c3 && c3==c4)
    {
        printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c2));
        px = 8;
    }
    return px;
}

然后你可以像这样分配球员的记分员:

player->scoreholder = checkForPoker(int j) //j is the player's number

请注意,出于性能原因,我会坚持使用第一种方法(第二种方法中的多余副本)。

进一步阅读

有关该主题的扩展阅读,您可以在这些链接中找到有用的信息: [1] [2]

关于c - 调用者看不到函数中的变量更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27320240/

相关文章:

c - 从电子邮件下载可执行应用程序时自动启动

java - 语义分析编译器阶段的子阶段是什么?

c - 如何定义和 typedef 一个包含指向自身的指针的结构?

variables - 在 Sass 中乘以百分比

Java变量赋值: why is box1 not updated to box3?

c - ttys0 丢失/乱码数据,而 ttyusb0 则不会

string - 读取包含字符串的行(Bash)

swift - 在 Swift 中初始化一个类

java - ImageIcon引用麻烦

java - 不可变和按值传递