2012-02-27 69 views
0

如何更改在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为什么呢? 在此先感谢。

+4

[关于C指针教程]的可能重复(http://stackoverflow.com/questions/4016765/tutorial-on-c-pointers) – 2012-02-27 03:33:20

+0

如果(BAA) ?它不是一个布尔值,这是合法的吗? – Induster 2012-02-27 03:33:40

+0

@Induster C中没有布尔类型。所有的布尔逻辑都是用ints完成的。 – Phonon 2012-02-27 03:35:48

回答

10

你想改变其中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的值永远不会被修改。

+0

@Jesse:不,我不是。这只是将'x'指向不同的字符串。 – AusCBloke 2012-02-27 03:59:46

+0

你是对的,将撤回我的评论(ideone.com给出了一个导致我的困惑的运行时错误)。 – 2012-02-27 04:14:04

+0

@Jesse:不用担心。 – AusCBloke 2012-02-27 04:37:05

0

在函数foo中,您只是在本地更改参数foo。当函数foo结束时,参数x仍然是x。你没有改变它在富。你只复制它并称为foo。

另外,请看@Greg Hewgill的评论。

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

你问题的题目是通用的。你已经为你的具体问题得到了答案。我将为intdouble类型添加几个说明性示例。

#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 
相关问题