繁体   English   中英

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

[英]How to change value of variable passed as argument?

如何更改在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为什么? 提前致谢。

您想要更改char*指向的位置,因此您将需要在foo()接受一个具有更多间接级别的参数 一个char** (指向char指针的指针)。

因此foo()将被重写为:

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

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

foo(&x, 1);

您不正确的代码段打印baa的原因是您只是将新值分配给与x无关的局部变量char *foo 因此x的值永远不会被修改。

有多个问题:

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

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

您的问题以通用方式命名。 您已经得到了特定问题的答案。 我将为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

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

另外,看看@Greg Hewgill 评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM