为什么我无法更改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返回后,如何指向预期内容?谢谢!
答案 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);