C 如何更改作为参数传递的变量的值?
如何更改在C中作为参数传递的变量的值? 我试过这个:C 如何更改作为参数传递的变量的值?,c,parameter-passing,C,Parameter Passing,如何更改在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为什么? 提前感谢。在函数foo中,您仅在本地更改参数foo。当函数foo结束时,参数x仍然是x。你没有在fo
void foo(char *foo, int baa){
if(baa) {
foo = "ab";
} else {
foo = "cb";
}
}
并致电:
char *x = "baa";
foo(x, 1);
printf("%s\n", x);
但它打印的是baa
为什么?
提前感谢。在函数foo中,您仅在本地更改参数foo。当函数foo结束时,参数x仍然是x。你没有在foo中更改它。你只是复制了它,然后打电话给foo
另外,请查看@Greg Hewgill comment。在函数foo中,您仅在本地更改参数foo。当函数foo结束时,参数x仍然是x。你没有在foo中更改它。你只是复制了它,然后打电话给foo
另外,请查看@Greg Hewgill comment。您想要更改
char*
指向的位置,因此您需要在foo()
中接受一个参数,并进行一级间接寻址;一个char**
(指向char
指针的指针)
因此,foo()
将被重写为:
void foo(char **foo /* changed */, int baa)
{
if(baa)
{
*foo = "ab"; /* changed */
}
else
{
*foo = "cb"; /* changed */
}
}
现在,当调用foo()
时,您将使用操作符(&
)的地址传递一个指向x
的指针:
不正确的代码段打印
baa
的原因是,您只是给局部变量char*foo
赋值,该变量与x
无关。因此,x
的值永远不会被修改。您想要更改char*
指向的位置,因此您需要在foo()
中接受一个具有一个间接级别的参数;一个char**
(指向char
指针的指针)
因此,foo()
将被重写为:
void foo(char **foo /* changed */, int baa)
{
if(baa)
{
*foo = "ab"; /* changed */
}
else
{
*foo = "cb"; /* changed */
}
}
现在,当调用foo()
时,您将使用操作符(&
)的地址传递一个指向x
的指针:
不正确的代码段打印
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);
这两种机制都起作用,但方式不同。每个问题都有不同的问题。没有一个“这比那好”的决定;哪个更好取决于所示代码片段范围之外的情况。存在多个问题:
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);
}
你的问题以一般的方式命名。你已经为你的具体问题找到了答案。我将为
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);
}
如果(baa)?它不是布尔值,这在c中合法吗?@Induster c中没有布尔类型。所有布尔逻辑都是用int完成的。@Phonon,错了。自C99以来,该语言将
\u Bool
作为基本类型,并在“stdbool.h”中使用Bool
;虽然有很多实现_Bool,但它通常只是一个限制为零或一个值的整数字。如果(baa)?它不是布尔值,这在c中合法吗?@Induster c中没有布尔类型。所有布尔逻辑都是用int完成的。@Phonon,错了。自C99以来,该语言将\u Bool
作为基本类型,并在“stdbool.h”中使用Bool
;虽然有很多实现_Bool,但它通常只是一个限制为零或一个值的整数字。@Jesse:不,我不是。这只是将x
指向一个不同的字符串文字。你是对的,将撤回我的评论(ideone.com给出了一个运行时错误,这导致了我的困惑)。@Jesse:不,我不是。这只是将x
指向一个不同的字符串文字。你是对的,将撤回我的评论(ideone.com给出了一个运行时错误,导致了我的混淆)。