如何更改作为参数传递的变量的值?
Posted
技术标签:
【中文标题】如何更改作为参数传递的变量的值?【英文标题】:How to change value of variable passed as argument? 【发布时间】:2012-03-16 14:40:32 【问题描述】:如何更改在 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
为什么?
提前致谢。
【问题讨论】:
如果(咩)?它不是布尔值,这在 c 中是否合法? @Induster C 中没有布尔类型。所有布尔逻辑都是用整数完成的。 @Phonon,错了。从 C99 开始,该语言将_Bool
作为原始类型,bool
在“stdbool.h”中。
同样,C 中的布尔比较仍然简单地检查零等价;虽然 _Bool 有许多实现,但它通常只是一个整数字,具有受限的零或一值。
【参考方案1】:
您的问题以通用方式命名。您已经为您的具体问题找到了答案。我将为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
【讨论】:
【参考方案2】:有多个问题:
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】:您想要更改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);
您的错误 sn-p 打印 baa
的原因是因为您只是为 local 变量 char *foo
分配了一个新值,这与 x
无关。因此x
的值永远不会被修改。
【讨论】:
@Jesse:不,我不是。这只是将x
指向不同的字符串文字。
你是对的,将撤回我的评论(ideone.com 给出了一个运行时错误,导致我感到困惑)。【参考方案4】:
在函数 foo 中,您仅在本地更改参数 foo。当函数 foo 结束时,参数 x 仍然是 x。您没有在 foo 中更改它。你只是复制它并调用了 foo。
另外,看看@Greg Hewgill 的评论。
【讨论】:
以上是关于如何更改作为参数传递的变量的值?的主要内容,如果未能解决你的问题,请参考以下文章