不,这不是多余的。C 是一种严格的按值传递语言,如果您想更改传入的参数(相信我),C 会使用指针模拟按引用传递。
在您的情况下,您想要更改 type 的变量TreeNode *
,因此您需要将指针传递给该变量,这就是您有双重间接的原因。
不要被您似乎已经有一个指针的事实所迷惑,在您的情况下,它在概念上与以下内容相同:
void changeInt (int *pXyzzy) { *pXyzzy = 42; }
除了那是为了改变一个int
. 如果你想改变一个int *
,你需要:
int some_int = 42;
void changeIntPtr (int **ppXyzzy) { *ppXyzzy = &some_int; }
注意增加的间接级别。这更类似于您所需要的,因为您正在更改指向某物的指针(因此您需要一个指向它的双指针)。
如果不通过 传入&some_treenode_pointer_variable
和设置它*some_treenode_pointer_variable = something
,更改的值永远不会找到返回给调用者的方式(该变量是按值传递的,只是一个本地副本)。
检查以下代码及其输出可能会有所帮助。方法 1 尝试通过简单地设置来更改指针,方法 2 使用指针到指针的方法来尝试更改它:
#include <stdio.h>
static int someInt;
static void method1 (int *pXyzzy) {
printf ("Pointer on calling method1 = %p\n", pXyzzy);
pXyzzy = &someInt;
printf ("Pointer on exiting method1 = %p\n", pXyzzy);
}
static void method2 (int **ppXyzzy) {
printf ("Pointer on calling method2 = %p\n", *ppXyzzy);
*ppXyzzy = &someInt;
printf ("Pointer on exiting method2 = %p\n", *ppXyzzy);
}
int main (void) {
int *plugh = NULL;
printf ("Pointer in main on start = %p\n", plugh);
method1 (plugh);
printf ("Pointer in main after method1 = %p\n", plugh);
method2 (&plugh);
printf ("Pointer in main after method2 = %p\n", plugh);
return 0;
}
输出是:
Pointer in main on start = 0x0
Pointer on calling method1 = 0x0
Pointer on exiting method1 = 0x404018
Pointer in main after method1 = 0x0
Pointer on calling method2 = 0x0
Pointer on exiting method2 = 0x404018
Pointer in main after method2 = 0x404018
您可以看到,虽然局部变量的值在方法 1 中发生了更改,但并没有反映回调用者main
。方法 2确实将更改反映给调用者。
顺便说一句,您不应该malloc
在 C 中转换返回值:
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
它可以隐藏某些细微的错误,并且完全没有必要,因为 C 显式转换void *
为其他指针类型。更好地使用:
TreeNode *node = malloc (sizeof (TreeNode));
您还应该检查返回值malloc
以确保您没有NULL
返回,以免出现以下行:
node->data = data;
会给你带来无尽的悲伤。