如何更改在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 为什么?提前致谢 .
baa
你想要改变 char* 指向的位置,因此你需要在 foo() 中接受一个更多级别的间接参数; a char** (指向 char 指针的指针) .
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 的指针:
&
x
foo(&x, 1);
您的错误代码段打印 baa 的原因是您只是将新值分配给本地变量 char *foo ,这与 x 无关 . 因此,永远不会修改 x 的值 .
char *foo
有很多问题:
void foo(char *foo, int baa) { if (baa) foo = "ab"; else foo = "cb"; }
此代码更改本地指针,但不执行任何操作 . 要复制字符串,需要使用 strcpy() 来保持接口相同:
strcpy()
void foo(char *foo, int baa) { if (baa) strcpy(foo, "ab"); else strcpy(foo, "cb"); }
但是,在执行此操作之前,您需要确保函数中的 foo 指向可修改的内存 . 需要修改调用代码以确保:
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);
这两种机制都有效,但是以不同的方式这样做 . 每种问题都有不同的问题 . 没有一个“这比那个更好”的决定;哪个更好取决于所显示的代码片段范围之外的情况 .
您的问题以通用方式 Headers . 您've already got answers for your specific problem. I' m将为 int 和 double 类型添加几个说明性示例 .
int
double
#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评论 .
4 回答
你想要改变
char*
指向的位置,因此你需要在foo()
中接受一个更多级别的间接参数; achar**
(指向char
指针的指针) .因此
foo()
将被重写为:现在,当调用
foo()
时,您将使用address-of运算符(&
)传递指向x
的指针:您的错误代码段打印
baa
的原因是您只是将新值分配给本地变量char *foo
,这与x
无关 . 因此,永远不会修改x
的值 .有很多问题:
此代码更改本地指针,但不执行任何操作 . 要复制字符串,需要使用
strcpy()
来保持接口相同:但是,在执行此操作之前,您需要确保函数中的
foo
指向可修改的内存 . 需要修改调用代码以确保:或者,您可以将
x
保留为指针并修改功能接口:和调用序列:
这两种机制都有效,但是以不同的方式这样做 . 每种问题都有不同的问题 . 没有一个“这比那个更好”的决定;哪个更好取决于所显示的代码片段范围之外的情况 .
您的问题以通用方式 Headers . 您've already got answers for your specific problem. I' m将为
int
和double
类型添加几个说明性示例 .输出:
在函数foo中,您只在本地更改参数foo . 当函数foo结束时,参数x仍为x . 你没有在foo中改变它 . 你只复制它并调用foo .
另外,看看@Greg Hewgill评论 .