哈希空间

C语言指针更新问题

现在有个指针 Node *node; 需要改变 node 的指向。
直接 node=newNode 就可以了。如果是通过一个函数实现,因为C语言中的函数参数是通过复制值的方式传递给函数。
比如以下代码:

void set(a) { a=3 } int main() { int a=1; set(a); printf("a=%d",a); //输出是 1 而不是 3 }

输出是 1 而不是 3 ,因为在 set 函数中 a 是复制了一份,对复制变量的更新不会改变传入参数的值。
set(a) 调用 实际等于 int _a=a; set(_a); 这样就不会改变 a的值。
那么怎么改变 a 的值呢? 把a的内存地址传过来,也就是指针。

void set(int *a) { *a=3; } set(&a);//这是调用方式,取地址当指针

回到正题,Node *node ; 写一个函数来修改 node 的指向,应该怎么写呢?

void set(Node **node) { *node=null; } Node *node=...; set(&node);

set 函数中的 node 就被叫做 二级指针了。这个叫法并不准确,也不符合实际情况。正确的理解就是找到真正本体的地址,然后对应的值。而不是直接更新复制的形参,这样修改是无效的。如同上一个例子。
这个问题也有一个角度认为是 c语言不支持 引用,只有值传递导致的缺陷。这个观点也是比较容易理解的。如果支持 引用传递,就可以不复制一遍指针进行传参。直接修改指针是有效的。

本文 最佳观看地址:https://www.hashspace.cn/c-pointer-test.html 阅读 1327

打开 哈希空间 微信小程序中查看更佳