Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针更改值而不作为参数传递_C_Pointers - Fatal编程技术网

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。