1

为什么我不能更改 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 返回后,a 如何指向预期内容?谢谢!

4

1 回答 1

2

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

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

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

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

ppc在函数内部,您通过取消引用一次来修改指向的指针ppc

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

当然调用需要取的地址b,像这样:maina

b(argv, &a);
于 2013-09-28T01:08:31.087 回答