c中var的地址是按值传递的吗?

Is the address of a var in c passed by value?

这是从主函数传递变量的方式:

Node merged = NULL; 
ErrorCode result = mergeSortedLists(left, right, &merged);

这是函数的签名。

ErrorCode mergeSortedLists(Node list1, Node list2, Node *merged_out); 

如果函数出现错误。 mergedsortedlists 我们应该 return res=Error 并且合并列表应该是 NULL

导师说我们应该赋值merged_out=NULL; 但地址不是按值传递给函数的吗?我们不应该将它指向的 var 分配给 NULL 即 *merged_out=NULL;

提前致谢!

一切在C中都是按值传递的

所以是的,&merged(指针)按值传递给 mergeSortedLists。换句话说,merged_out 指向的对象可以通过指针引用在该函数中更改,但该函数中指针值的任何更改都不会反映在调用者中。

我不确定你的导师为什么要你在函数本身中写 *merged_out = NULL。为了使它有意义,那么 merged_out 必须是指向指针的指针,并在调用站点进行适当的更改。

名字Node似乎是指针类型的别名。

类似

typedef struct node
{
    //...
} *Node;

所以在这段代码中

Node merged = NULL; 
ErrorCode result = mergeSortedLists(left, right, &merged);

变量merged是一个指针。它通过引用函数 mergeSortedLists.

传递

为指针类型引入这样的别名只是一个坏主意,因为它只会让代码的读者感到困惑。

如果接受名称 Node 是指针类型的别名(例如

typedef struct node *Node;

然后这个函数声明

ErrorCode mergeSortedLists(Node list1, Node list2, Node *merged_out); 

等同于

ErrorCode mergeSortedLists( struct node  *list1, struct node *list2, struct node **merged_out); 

也就是说三个参数都是指针类型

Node merged = NULL; merged is pointer to user defined struct. (its done by typedef operator) for example:

struct S_Node{
    int m_var;
    struct S_Node* p_m_next;
};
typedef struct S_Node* Node;  /*now Node is new type. its pointer to S_Node*/

所以merged_out是指向指针的指针。因此,如果函数出现某些错误,我们在此代码段中将其设置为 NULL:

ErrorCode mergeSortedLists(Node list1, Node list2, Node *merged_out)
{
    if(!list1 || !list2) /*lets assume that this is the error case*/
    {
        *merged_out=NULL;
        return Error;
    }
}