将指针传递给函数时使用& -operand?

时间:2012-06-16 11:47:14

标签: c function pointers

int enter_path(char** path) {
  char* standard = "./questions.txt";
   printf("\n\t%s\n\t%s",
          "Please enter the file location.", "path: ");
   fgets(*path, MAX_PATH_LENGTH ,stdin);
     *(*path + (strlen(*path)-1) ) = '\0';
   if(**path == '\n' )
     *path = strdup(standard);
   return 0;
}

int main(void){
  char* path = malloc(MAX_PATH_LENGTH);
  enter_path(&path);
  some_other_function_using_the_path_string(path);
}

上面的代码运行正常,我发布此代码的原因如下。

为什么我必须通过指针的地址"路径"对函数enter_path,所以其他一些函数可以使用/读取修改后的值。 简而言之,为什么在调用" enter_path"时必须使用& -operand。函数,并且不能将enter_path定义为" int enter_path(char * path);"

我知道这是引用数据类型的正常变量,如int,long等。 但我假设在使用指针时,每个其他功能都应该可以看到更改。导致指针仍然引用内存中的同一点,只是值已被更改。

难道我看到这一切都错了吗?

PS:我尽力保持我的代码符合ansi-C,这就是我使用fgets而不是readline的原因。只是说因为我已经就readline功能更容易/更安全的事实得到了一些评论。

亲切的问候, JD

3 个答案:

答案 0 :(得分:2)

如果你有一个类型T的变量,你想要一个函数能够修改,你需要通过指针传递它,即:

void foo(T *p) { *p = 42; }

int main(void) {
    T t;
    foo(&t);
    // The value of t is now 42
}

在您的代码中,Tchar *;换句话说,你的函数需要能够修改指针,所以你需要传递一个指向该指针的指针。


然而,这不是好代码。如果(**path == '\n')为真,那么你将泄漏内存。

答案 1 :(得分:1)

原因是如果您将参数类型指定为char *,您将在函数中操作指针的副本,因此您的代码(针对此方案进行了修改)

path = strdup(standard);

在函数结束后不会反映在调用者中

通过passig变量的地址,你可以改变指向指针,即使在函数返回后这个改变仍然存在

将指针视为您的数据(就像使用int一样),通过传递char *指针,您可以修改指向的字符;通过传递char **指针,您可以修改指向指针(修改也反映在调用函数中)。

答案 2 :(得分:0)

您正在传递一个变量path,它本身就是一个指针。 但是您正在函数enter_path中修改指针本身,因此您必须将指针传递给path,因此path的地址将被传递,因此&path传递。

在当前场景中,行

*path = strdup(standard);

它确实修改了函数中的变量路径,但它的值不会在函数外部改变,即在函数main中。