c++ 将指针作为参数传递,它在 java 中的对应项

c++ passing a pointer as a parameter, and its counterpart in java

如果给定一个列表,并且每个 ListNode 都定义为一个结构:

Struct ListNode
{
    int val;
    ListNode *next;
    //and some constructor
}

我们得到了列表的头指针,用 ListNode *head 表示。 现在,如果我将 ListNode *head 作为参数传递给函数,例如

int sum(ListNode *head){}

然后我在不复制 *head 的情况下遍历列表。 例如,我做

for(; head!=null; head=head->next)

函数调用后*head是否仍指向链表的头节点?

而在Java中,如果我们将ListNode定义为一个class,对ListNode头部做同样的遍历(不做拷贝),会发生什么?

有人可以从内存分配的角度来说明这一点吗?谢谢

注意:由于 Java 中的 List 界面,我对此感到困惑。我认为即使我们将 ArrayList 作为参数传递给函数,它的值也可以更改。但是在 C++ 中这不会发生?

Will *head still point to the head node of the list after the function is called?

是的。通过分配给 head,您只是在修改指针,而不是指向的内存。如果您分配给 *headhead->val 等,那么将在调用者中观察到该更新。

And in Java, if we define ListNode as a class and do the same traversal with ListNode head (without making a copy), what will happen then?

与 C 中相同。通过分配给 head,您仅修改引用,而不修改引用的内存。

在 Java 中,head 引用的副本将被传递到函数中。但是,由于 head 引用的副本仍然是对 ListNode 的引用,您仍然可以成功地迭代原始 linkedList。

您提到:

if I pass ListNode *head as a parameter into a function such as

int sum(ListNode *head){}

and then I traverse the list without making a copy of *head.

是的,没错。在 Java 中,您可以执行相同的操作(遍历列表而不复制 head),因为您正在使用 head.

的副本进行遍历

你说 "without making a copy",这实际上是你答案的关键:调用函数时,head 值的副本作为参数传递给它。因此,无论函数在其内部对其进行何种更改,都不会以任何方式影响调用者的副本。

这叫做"pass-by-value"。在 C++ 中,有一种通过引用传递参数的方法:int sum((ListNode *)& head){},以这种方式声明的函数与调用者拥有的 head 相同,而不是副本,并且它对其所做的任何更改都将也对调用者可见。

Java 和 C 没有这种能力,函数总是获取调用者值的副本作为参数,并且不能对其进行任何调用者会看到的更改。

在 C++ 中,您将第一个节点的地址从 main 传递到 function.So head(in main)中的值不会 change.That 是变量 head(in main) 和 head(in function) 是两个不同的变量。head(in function) 只是在变化。