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

如何更改在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() ,你将使用address-of运算符( & )传递一个指向x指针

 foo(&x, 1); 

您的错误代码段打印baa的原因是您只是为局部变量char *foo分配一个新值,该值与x无关。 因此, 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  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评论。