2010-06-06 240 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; 

我建議你選擇一個命名約定,這意味着你保持你的類型和你的變量分開。這有點令人困惑。