首页 文章

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

提问于
浏览
0

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

4 回答

  • 4

    你想要改变 char* 指向的位置,因此你需要在 foo() 中接受一个更多级别的间接参数; a char** (指向 char 指针的指针) .

    因此 foo() 将被重写为:

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

    现在,当调用 foo() 时,您将使用address-of运算符( & )传递指向 x 的指针:

    foo(&x, 1);
    

    您的错误代码段打印 baa 的原因是您只是将新值分配给本地变量 char *foo ,这与 x 无关 . 因此,永远不会修改 x 的值 .

  • 0

    有很多问题:

    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

    您的问题以通用方式 Headers . 您've already got answers for your specific problem. I' m将为 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
    
  • 12

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

    另外,看看@Greg Hewgill评论 .

相关问题