双指针vs单指针

F. *_*mir 5 c pointers

有人可以向我解释/给出一个推理,为什么变量i在下面的代码片段中的主函数的值不会通过函数test1改变,而它确实通过test2改变了?我认为单个指针应该足以改变i的值.为什么我们应该使用双指针?

#include <stdio.h>

void test1(int* pp)
{
   int myVar = 9999;
   pp = &myVar;
}

void test2(int** pp)
{
   int myVar = 9999;
   *pp = &myVar;
}

int main()
{
   printf("Hej\n");
   int i=1234;
   int* p1;

   p1 = &i;

   test1(p1);
   printf("does not change..., p1=%d\n",*p1);

   test2(&p1);
   printf("changes..., p1=%d\n",*p1);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

mat*_*975 6

在C中,参数按值传递.这意味着test1当您传递pp副本时,由指针构成,当您更改它时,对副本而不是指针本身进行更改.随着test2副本是一个双指针的,但是当你提领,并指定在这里

*pp = &myVar;
Run Code Online (Sandbox Code Playgroud)

你正在改变所指向的东西,而不是改变pp自己.请注意,此行为test2未定义,如此处的其他一些答案中所述