2013-09-28 40 views
1

为什么我不能更改char *指向的内容?
例如:如何在将char *传递给C中的函数后指向期望的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] 
} 

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

+0

这只是大量的错误C,你不应该感到惊讶,它表现得异乎寻常。声明一个正确的函数原型,它将无法编译,就像你期望和希望的那样。 –

+0

我无法弄清楚你在这个例子中要做什么。请阅读C的基础知识。 – shunyo

回答

2

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

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

这是如何适用于您的情况?你的功能b需要修改一个指向char,因此它需要采取一个指针指向一个字符,像这样:

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

里面你修改指针到ppc点提领ppc一次:

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

过程调用从main需求b采取a地址,像这样:

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