2012-03-05 24 views
1

我已閱讀有關「指針」的主題,但我仍然有一些問題。使用指針的條件

// graph.cpp 

struct Edge { 
    int from; 
    int to; 
    unsigned int id; 
    Edge(): from(0), to(0), id(0) {}; 
}; 

struct Vertex { 
    int label; 
    vector<Edge> edge; 
}; 

class Graph: public vector<Vertex> { 
    int gid; 
    unsigned int edge_size; 
}; 

如果我聲明在另一個文件

bool get_forward_root (Graph &g, Vertex &v, vector<Edge*> &result) { 
    for(vector<Edge>::iterator it = v.edge.begin(); it != v.edge.end(); it++) { 
     if(v.label <= g[it->to].label) 
     result.push_back(&(*it)); 
    } 
} 

在我的理解,it可以被視爲指針迭代器,因爲v.edge.begin()vector<Edge>第一Edge對象,但什麼是&(*it)

問題2. g,&g,*g有什麼區別?

在我的理解:

  • &g是內存地址。
  • *g是一個Graph指針指向一個圖對象,所以我們可以使用Graph * g = new Graph();
  • g是一個圖表對象

* G和G之間的差是我們如何使用,例如,兩個條件是相同的:

條件1:

Graph *g = new Graph(); 
g->gid = 0; 

條件2:

Graph g; 
g.gid = 0; 

問題3。

下面的含義是什麼?

Graph &g 

,爲什麼我們使用g[it->to].label&g[it->to].label 非常感謝:)

+6

你應該選擇一本適當的書。你有很多問題。 – 2012-03-05 13:33:49

回答

5

問題1:什麼是&(*吧)

it的行爲像一個指針,但它不是一個指針。如果它是指針,則&*it將與it相同。在一般情況下,&(*it)是迭代器it指向的對象的地址(真實指針)。我們可以在這裏假設&運算符沒有超載。

問題2:g,& g,* g是什麼區別?

gg。 g的地址是&g*g是對象g指向(如果g是指針)。你的兩個條件(我不明白你爲什麼稱他們爲條件)做的事情幾乎是一樣的,是的。

問題3:什麼是Graph &g?

這就是所謂的參考。定義後,應立即初始化。將引用看作是對象的另一個名稱。 (更好的是,讀一本書,見下文)。

您的問題一切都將在任何像樣的C++初學者的書進行徹底的回答。爲此,我特別推薦Lippman的C++入門。找到其他好的頭銜here

+0

圖g; => g是一個Graph對象;圖g * = new Graph()=> g是指向g *的指針;我可以使用&g來獲取g *的地址(我的理解是正確的嗎?)謝謝:) – LoveTW 2012-03-05 16:58:37

1

it不是指針,它是一個迭代器。基本上,它的行爲就像一個指針(取消引用和箭頭操作符被重載),也像數組索引(++,--,+=等)使迭代器指向下一個元素。對於向量,您可能會發現它是無用的,但這很棒對於其他容器)。

因此,&(*it)將迭代器轉換爲一個真正的指針:它獲取指向對象的地址。它雖然在矢量上沒有太大差別,因爲所有元素都存儲在連續的內存區域中。

1

問題1:it不是指針,它是一個迭代器。迭代器的行爲 有點像指針,只有某些事情,但他們不是 指針。在該表達式中&(*it)*取消引用迭代,以獲得 到實際的對象其指定的引用; &然後取 這個對象的地址,這個地址產生一個實際的指針,指針爲 類型(這是容器result要求的)。

問題2:g是一個對象的名稱;在表達式中,它指定對象,並具有對象的類型。 &g是對象的 地址;一個對象本身(儘管是臨時的),其指針類型爲 。 *g是不合法的。至少只要沒有用戶定義 運營商發揮作用:類型Graph可能會超載operator*operator&做更多或更少的事情。 (鑑於例如, g[it->to],很顯然,Graph重載[];這意味着 平時的身份a[b]意味着*(a+b)不成立),並在你的 代碼,g一個指向Graph,它是一個參考,其作用像 別名—不管它初始化所用的另一個名稱。

至於Graph* gGraph g:有在 至關重要的差異的對象的壽命(或在Graph* g的情況下,壽命將尖的 到對象)。

問題3:Graph& g與運營商&沒有任何關係;它 是一種告訴編譯器g是參考的手段。參考 是從根本上只是一個名稱爲草簽對象(或 唯一的名字,如果初始化對象不具有否則名稱)。 引用大部分(但不是唯一)用作函數參數。

+0

如果我在get_forward_root中添加g [vid],這是一個對象?爲什麼我必須使用Vertex&v = g [vid]而不是Vertex * v = g [vid]?謝謝:) – LoveTW 2012-03-05 17:22:24

+0

'g [vid]'是一個表達式。換句話說,它返回一個引用,以及向量中元素的別名。它不是一個指針,所以你不能把它分配給一個指針。 (大多數時候,你可能只會寫'Vertex v = g [vid]',並定義一個對象。) – 2012-03-05 18:49:53

+0

感謝您的建議!但是這個示例代碼來自gSpan的作者,他使用'&v = g [vid]'not'v = g [vid]',你知道目的嗎?謝謝:) – LoveTW 2012-03-06 02:12:05