2010-06-06 124 views
2

对不起,如果这个问题之前已经问过。在我的搜索中,我没有发现有人问我想知道什么。指针初始化

基本上,当我有这样的:

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; 

我的意思是,头戴式>接下来就是指向对象的newitem指针,所以我认为不newItem.data或下一个自己。那么我怎样才能像这样安全地使用上面描述的未初始化的指针呢?现在头是不是指向一个未初始化的指针?

回答

9

我,我 声明和保留空间的印象,但不是 定义,一个指向struct节点,是 正确的吗?

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

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

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分配给由pnode指向的节点实例的名为data的成员。当然,如果你给你的节点的构造函数(你通常应该做的),你可以做到这一切在一个:

struct node 
{ 
    int data; 
    node * next; 

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

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

创建:

  • 上了一个新节点堆(在你的情况,因为你忽略堆栈上的()
  • 一个指针,它指向这个新节点包含未初始化的值。

    newItem->数据= 100

简单地设置新分配的节点的data成员100

3

当你定义你的结构为你做,并呼吁new像你这样,你在做什么是:

  1. 在堆上分配新的struct node
  2. 为堆栈分配空间newItem并将其值分配给您分配的新结构的地址。

您没有设置任何值到任何的新结构的成员。如果您希望在创建结构的新实例时发生这种情况,您需要定义一个构造函数。

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)未初始化,因此既不为空也不指向有效的node对象。

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

newItem->next = temp; 

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