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;
}
}
这是从主函数传递变量的方式:
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;
}
}