C 指针更改值而不作为参数传递
下面是一段代码片段,该代码涉及二叉树上的一些转换C 指针更改值而不作为参数传递,c,pointers,C,Pointers,下面是一段代码片段,该代码涉及二叉树上的一些转换 void fixPrevPtr(struct node *root) { static struct node *pre = NULL; if (root != NULL) { fixPrevPtr(root->left); root->left = pre; pre = root; fixPrevPtr(root->right);
void fixPrevPtr(struct node *root)
{
static struct node *pre = NULL;
if (root != NULL)
{
fixPrevPtr(root->left);
root->left = pre;
pre = root;
fixPrevPtr(root->right);
}
}
这里,“pre”在每个函数中初始化为NULL。但当函数输入'if'子句并执行root->left=pre时,分配的pre不为空。它被函数fixpreptr(root->left)以某种方式改变了
我的问题是,它如何在不被传递到函数中的情况下进行更改
提前感谢。
pre
是静态的,因此它在调用之间保持其值fixPrevPtr()
是递归的(调用自身),因此对pre
的任何更改都会“卡住”。此位不正确
在这里,“pre”在每个函数中初始化为NULL
由于static关键字,它只初始化一次。如果函数更改了该值,那么下次函数将使用该值而不是null
static struct node *pre = NULL;
由于static
关键字,初始化pre
一次
但下次输入此函数时,pre
将为其指定最后一个值
我建议您阅读以下内容:
在C标准中:
6.2.4物品的储存期限
使用外部或内部链接或存储类说明符static声明其标识符的对象具有静态存储持续时间。它的生命周期是程序的整个执行过程,在程序启动之前,它的存储值只初始化一次
pre
是一个静态值,它存储在数据段
中,它的作用域不仅是fixpreptr
,而且是该过程中的所有其他函数,因此,当然,fixpreptr
本身可以更改它。您添加了带有struct node*pre=NULL
的static
关键字,这就是为什么当pre=root代码>已执行。
删除static
,就可以开始了
您可以从这个链接阅读关于静态变量的内容
静态自动变量即使在定义它们的块终止后仍然存在。因此,函数中静态变量的值在对同一函数的重复函数调用之间保留
你知道静态的是什么吗?@KerrekSB老实说,他看起来是这样吗?@KerrekSB。。。老实说,我很尴尬……我只是在节点之前没有看到静态…我在C++中工作,所以我忽略了在C中定义变量时使用的StRtt关键字。当我在浏览代码时,可能是由于纯粹的麻木不仁,我忽略了static和struct。