如何更改在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
为什么?
提前谢谢。
答案 0 :(得分:12)
您想要更改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
分配了一个新值,该变量与{{1}无关}。因此,永远不会修改x
的值。
答案 1 :(得分:4)
有很多问题:
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);
这两种机制都有效,但是以不同的方式这样做。每种问题都有不同的问题。没有一个“这比那个更好”的决定;哪个更好取决于所显示的代码片段范围之外的情况。
答案 2 :(得分:4)
您的问题以通用方式标题。您已经为您的具体问题找到了答案。我将为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
答案 3 :(得分:0)
在函数foo中,您只在本地更改参数foo。当函数foo结束时,参数x仍为x。你没有在foo中改变它。你只复制了它并调用了foo。
另外,请看@Greg Hewgill评论。