如何更改作为参数传递的变量的值?

Posted

技术标签:

【中文标题】如何更改作为参数传递的变量的值?【英文标题】:How to change value of variable passed as argument? 【发布时间】:2012-03-16 14:40:32 【问题描述】:

如何更改在 C 中作为参数传递的变量的值? 我试过这个:

void foo(char *foo, int baa)
    if(baa) 
        foo = "ab";
     else 
        foo = "cb";
    

然后调用:

char *x = "baa";
foo(x, 1);
printf("%s\n", x);

但它打印baa 为什么? 提前致谢。

【问题讨论】:

如果(咩)?它不是布尔值,这在 c 中是否合法? @Induster C 中没有布尔类型。所有布尔逻辑都是用整数完成的。 @Phonon,错了。从 C99 开始,该语言将 _Bool 作为原始类型,bool 在“stdbool.h”中。 同样,C 中的布尔比较仍然简单地检查零等价;虽然 _Bool 有许多实现,但它通常只是一个整数字,具有受限的零或一值。 【参考方案1】:

您的问题以通用方式命名。您已经为您的具体问题找到了答案。我将为intdouble 类型添加几个说明性示例。

#include <stdio.h>

void incrementInt(int* in, int inc)

   *in += inc;


void incrementDouble(double* in, double inc)

   *in += inc;


int main()

   int i = 10;
   double d = 10.2;

   printf("i: %d, d: %lf\n", i, d);

   incrementInt(&i, 20);
   incrementDouble(&d, 9.7);

   printf("i: %d, d: %lf\n", i, d);

输出:

i: 10, d: 10.200000
i: 30, d: 19.900000

【讨论】:

【参考方案2】:

有多个问题:

void foo(char *foo, int baa)

    if (baa) 
        foo = "ab";
    else 
        foo = "cb";

这段代码改变了本地指针,但没有做任何事情。要复制字符串,您需要使用strcpy() 来保持界面不变:

void foo(char *foo, int baa)

    if (baa) 
        strcpy(foo, "ab");
    else 
        strcpy(foo, "cb");

但是,在此之前,您需要确保函数中的 foo 指向可修改的内存。调用代码需要修改以确保:

char x[] = "baa";
foo(x, 1);
printf("%s\n", x);

或者,您可以将x 保留为指针并修改函数接口:

void foo(char **foo, int baa)

    if (baa) 
        *foo = "ab";
    else 
        *foo = "cb";

以及调用顺序:

char *x = "baa";
foo(&x, 1);
printf("%s\n", x);

这两种机制都起作用,但以不同的方式起作用。每个问题都有不同的问题。没有一个“这比那个更好”的决定。哪个更好取决于所示代码片段范围之外的情况。

【讨论】:

【参考方案3】:

您想要更改char* 指向的位置,因此您需要在foo() 中接受一个参数,并再增加一层间接char**(指向 char 指针的指针)。

因此foo() 将被改写为:

void foo(char **foo /* changed */, int baa)

   if(baa) 
   
      *foo = "ab"; /* changed */
   
   else 
   
      *foo = "cb"; /* changed */
   

现在当调用foo() 时,您将使用地址运算符 (&amp;) 传递一个 指向 x 的指针:

foo(&x, 1);

您的错误 sn-p 打印 baa 的原因是因为您只是为 local 变量 char *foo 分配了一个新值,这与 x 无关。因此x 的值永远不会被修改。

【讨论】:

@Jesse:不,我不是。这只是将x 指向不同的字符串文字。 你是对的,将撤回我的评论(ideone.com 给出了一个运行时错误,导致我感到困惑)。【参考方案4】:

在函数 foo 中,您仅在本地更改参数 foo。当函数 foo 结束时,参数 x 仍然是 x。您没有在 foo 中更改它。你只是复制它并调用了 foo。

另外,看看@Greg Hewgill 的评论。

【讨论】:

以上是关于如何更改作为参数传递的变量的值?的主要内容,如果未能解决你的问题,请参考以下文章

参数传递

JavaScript,当变量作为参数传递时更改函数内部的变量值[重复]

expect接收命令行传递的参数并设置为变量和打印变量的值

在vb中传递参数的方法有几种 带你了解最常见的2种方法

x86 NASM更改未作为参数传递的地址的值

38 py改变函数参数的值关键字参数和参数默认值函数中可变参数将序列中的元素值作为函数对应的参数值传