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

时间:2020-06-05 23:11:11

标签: 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;
}

此代码显示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;
}

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

2 个答案:

答案 0 :(得分:6)

此功能:

void add(List *head, int data)

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

使函数通过 reference 代替指针:

void add(List * &head, int data)

现在在函数内部更改head会在head函数中更改main

答案 1 :(得分:0)

添加方法有两个问题:

1)您需要接受引用指针(或指向指针的指针)

2)您需要添加遍历逻辑直到列表中的最后一个节点,并在末尾添加新节点。否则,每次使用新节点重置列表头时,新节点都指向null并成为一个节点列表。

类似的实现,您可以在这里https://github.com/alokkusingh/DataStructure中进行参考。该实现是用C语言(不是C ++)