将char *传递给C中的函数后如何指向期望的char数组?

时间:2013-09-28 00:58:53

标签: c function pointers char

为什么我无法更改char *指向的内容?
例如:

int main(int argc, char * argv[]) {
    char *a = NULL; // now a = NULL
    b(a);
    // but now a points to NULL again! Why?
}

void b(char *argv[], char* c) {
    // now a is passed in 
    c = *argv[3];
    // now a actually points to the start of char array pointed to by argv[3]
}

从输出中,我看到* a被传递给函数。然后在函数b中,它实际上指向了期望的char []。但是当从b返回时,a再次变为NULL。为什么?从b返回后,如何指向预期内容?谢谢!

1 个答案:

答案 0 :(得分:2)

C按值传递所有内容,包括指针。函数参数类似于从调用者获取其初始值的局部变量。进入函数后,可以自由更改参数的值,而不会影响调用者传递的值。

C将可修改的东西传递给函数的方法是传递指针。如果要修改某种类型T的值,则将指针传递给T;如果要修改指向T的指针,则必须将指针传递给指向T的指针,依此类推。换句话说,间接级别必须比被更改的值高一级。

这如何适用于您的情况?你的函数b需要修改指向char的指针,因此它需要一个指向char的指针,如下所示:

void b(char *argv[], char **ppc) {
    ...
}

在函数内部,您可以通过解除引用ppc一次来修改ppc指向的指针:

*ppc = argv[3]; // No asterisk here in front of `argv`

当然,从b调用main需要获取a的地址,如下所示:

b(argv, &a);
相关问题