指针初始化

IAE*_*IAE 2 c++ pointers

对不起,如果之前已经问过这个问题.在我搜索SO时,我找不到一个问我想知道什么.

基本上,当我有这个:

typedef struct node
{
    int data;
    node *node;
} *head;
Run Code Online (Sandbox Code Playgroud)

并做 node *newItem = new node;

我的印象是我正在宣布和保留空间,但没有定义,指向struct node,是正确的吗?

所以,当我这样做

newItem->data = 100newItem->next = 0

我有点迷惑不解了.newItem = 0会说出究竟是什么?两个datanext?整个对象?

当我使用typedef时,我特别困惑.哪个部分是宏?我假设节点,因为我就是这样称呼它,但为什么我需要它呢?

最后,当我这样做时会发生什么:

node *temp;
temp = new node;

temp = head->next;
head->next = newItem;
newItem->next = temp;
Run Code Online (Sandbox Code Playgroud)

我的意思是,head-> next是一个指向对象newItem的指针,所以我假设不是newItem.data或者是next.那么我怎么能像上面这样安全地使用我上面描述的未初始化指针呢?现在是不是指向一个未初始化的指针?

小智 10

我的印象是我声明并保留空间,但没有定义,指向struct node的指针,是正确的吗?

不.您正在声明一个指针,在堆栈上为指针分配空间,并为其节点动态分配存储空间.

不要写这样的东西来迷惑自己:

typedef struct node
{
    int data;
    node * next;
} *head;
Run Code Online (Sandbox Code Playgroud)

在C++中编写结构的方法是:

struct node
{
    int data;
    node * next;
};
Run Code Online (Sandbox Code Playgroud)

您现在可以创建一个指针:

node * pnode;
Run Code Online (Sandbox Code Playgroud)

它为指针分配存储空间.

并且您可以为节点动态分配存储空间,并使指针指向它:

pnode =  new node;
Run Code Online (Sandbox Code Playgroud)

或者一个一个地完成:

node * pnode = new node;
Run Code Online (Sandbox Code Playgroud)

现在当你说:

pnode->data = 10;
Run Code Online (Sandbox Code Playgroud)

你没有分配任何东西.您正在为被指向的节点实例调用的成员分配 10 .当然,如果你给你的节点一个构造函数(你通常应该这样做),你可以在一个节点中完成所有操作:datapnode

struct node
{
    int data;
    node * next;

    node( int n, node * np ) : data( n ), next( np ) {}
};

node * pnode = new node( 10, 0 );
Run Code Online (Sandbox Code Playgroud)