如何更改在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中作为参数传递的变量的值? 我尝试这样做:如何更改作为参数传递的变量的值?
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()
将被改写为:
foo(&x, 1);
:
void foo(char **foo /* changed */, int baa)
{
if(baa)
{
*foo = "ab"; /* changed */
}
else
{
*foo = "cb"; /* changed */
}
}
现在呼吁foo()
时,你会使用地址运算符(&
)传递一个指针x
你不正确的代码片段打印baa
的原因是因为你只是给loc分配一个新值al变量char *foo
,这与x
无关。因此,x
的值永远不会被修改。
在函数foo中,您只是在本地更改参数foo。当函数foo结束时,参数x仍然是x。你没有改变它在富。你只复制它并称为foo。
另外,请看@Greg Hewgill的评论。
有多种问题:
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);
两种机制都可以工作,但以不同的方式进行。每个问题都有不同的问题。没有一个“这比这个决定更好”。这更好取决于所示代码片段范围之外的情况。
你问题的题目是通用的。你已经为你的具体问题得到了答案。我将为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
[关于C指针教程]的可能重复(http://stackoverflow.com/questions/4016765/tutorial-on-c-pointers) – 2012-02-27 03:33:20
如果(BAA) ?它不是一个布尔值,这是合法的吗? – Induster 2012-02-27 03:33:40
@Induster C中没有布尔类型。所有的布尔逻辑都是用ints完成的。 – Phonon 2012-02-27 03:35:48