指针初始化

时间:2010-06-06 17:06:05

标签: c++ pointers

很抱歉,如果之前已经提出这个问题。在我搜索SO时,我找不到一个问我想知道什么。

基本上,当我有这个:

typedef struct node
{
    int data;
    node *node;
} *head;

并执行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;

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

4 个答案:

答案 0 :(得分:10)

  

我的印象是我   宣布和保留空间,但不是   定义,指向struct node的指针,是   那是对的吗?

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

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

typedef struct node
{
    int data;
    node * next;
} *head;

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

struct node
{
    int data;
    node * next;
};

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

node * pnode;

为指针分配存储空间。

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

pnode =  new node;

或者一起完成:

node * pnode = new node;

现在,当你说:

pnode->data = 10;
你没有分配任何东西。您 10分配给data指向的节点实例的名为pnode的成员。当然,如果你给你的节点一个构造函数(你通常应该这样做),你可以在一个节目中完成所有这些:

struct node
{
    int data;
    node * next;

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

node * pnode = new node( 10, 0 );

答案 1 :(得分:3)

node *newItem = new node;

您创建:

  • 堆上的新节点(在您的情况下包含未初始化的值,因为您省略了()
  • 堆栈上的指针,指向此新节点。

    newItem-> data = 100

只需将新分配的节点的data成员设置为100。

答案 2 :(得分:3)

当你像你一样定义你的结构并像你一样调用new时,你所做的是:

  1. 在堆上分配新的struct node
  2. 在堆栈上为newItem分配空间,并将其值设置为您分配的新结构的地址。
  3. 您没有为新结构的任何成员设置任何值。如果您希望在创建结构的新实例时发生这种情况,则需要定义构造函数。

答案 3 :(得分:3)

typedef struct node
{
    int data;
    node *node;
} *head;

这会将node声明为结构,并将head定义为node*的同义词,因此head是一种类型而非对象。

这会使此行为非法:temp = head->next;,因为->不适用于某种类型。

new node动态分配node对象并返回指向它的指针。 node *newItem = new node;将此指针指定给newItem。但是请注意,newItem->nodenode这里是指针对象而不是类型node)未初始化,因此既不为null也不指向有效的node对象。

这也是非法的,因为node没有next成员。

newItem->next = temp;

我建议您选择一个命名约定,这意味着您将类型和变量分开。这有点令人困惑。