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

如何更改在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。你没有在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给出了一个运行时错误,导致了我的混淆)。