为什么对函数内部的指针所做的更改在函数外部不可见?

4 c++ pointers

我正在实现一个链表。有一个问题:当我在函数内部更改指针时,更改在函数外部不可见。

#include<bits/stdc++.h>
using namespace std;
//define

class List{
    public:
    int data;
    List *next;
    public:
        List(int n){
            this->data=n;
            this->next=NULL;
        }
};

void add(List *head,int data){
    List * nn = new List (data);
    head=nn;
}
// driver code
int main(){
    List *head=NULL;
    List * nn = new List (45);
    head=nn;
    cout<<head->data;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码正在打印 45。

class List{
    public:
    int data;
    List *next;
    public:
        List(int n){
            this->data=n;
            this->next=NULL;
        }
};

void add(List *head,int data){
    List * nn = new List (data);
    head=nn;
}
// driver code
int main(){
    List *head=NULL;
    add(head,45);
    cout<<head->data;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序不打印任何内容。它只是崩溃。

cig*_*ien 6

这个功能:

void add(List *head, int data)
Run Code Online (Sandbox Code Playgroud)

head通过copy获取指针,因此调用者看不到函数内部指针的更改。这意味着headin 中的指针main未指向有效内存,取消引用它会调用未定义的行为(这可能会导致崩溃)。

使函数通过引用获取指针:

void add(List * &head, int data)
Run Code Online (Sandbox Code Playgroud)

现在改变head的功能变化中headmain作用。