2013-01-11 32 views
1

我會直截了當的動態數組爲您節省多餘的閱讀都有些厭煩:對象在C /班++

我已經試過了對象的動態數組梳理互聯網搜索教程/他們在這裏解釋指針是如何實現的。 這尤其是:TheClass **foo[10];或類似的東西,我不明白什麼兩個星星/星號是好的,以及如何使用它們。 而這整個事情一般。

我知道動態數組是如何聲明的,如何使用常規指針,如何創建類,如何製作動態數組類。 但所有這些結合讓我感到困惑。

所以我的問題是:

  1. 這是什麼呢?它是如何工作的?

  2. 你能推薦一個網站,你知道這個的例子/教程可以找到?

  3. 這是否有一個特定的名稱,而不是「具有雙指針的動態對象數組」 或whatnot?

  4. 如果沒有教程介紹,我會很感激,如果你可以做一個非常非常簡短的例子。

例如像

int *something; 
int somethingElse = 10; 
something = &somethingElse; /*Now when you change "somethingElse","something" 
           will also change to the same number*/ 

有點超短期舉例和說明像將不勝感激。 =)

+3

所以......你不明白指針的指針?是嗎? – Useless

+0

如果這就是它的名字,那麼是的。 – user1770094

+0

'X * x'是一個指針。 'X ** x'是一個指向指針的指針。 'X ** x [10]'是指向指針的10個指針的數組。現在你知道了,如果不知道,你至少知道要搜索什麼。 – Useless

回答

2

最簡單的,更多或更少的有用的,例如,使用指針的指針將是一個二維陣列。因此,例如

//Create a pointer to (an array of) pointers to (an array of) ints 
int** array2D; 

//Create a array of pointers to (an array of) ints and assign it to the pointer 
array2D = new int*[10]; 

//Assign each of the pointers to a new array of 10 ints 
for(size_t i =0; i<10;i++) { 
    array2D[i] = new int[10]; 
} 

//Now you have an 2 dimensional array of ints that can be access by 
array2D[1][3] = 15; 
int test = array2D[1][3]; 

我希望這個解釋有點什麼指針的指針以及它們如何工作。

+0

但是這個問題有一個雙指針數組(間接一級)。 –

+0

好東西,謝謝! :) – user1770094

+0

@ BenVoigt:是的,但我希望一旦理解了指向X的指針的概念,下一步就應該很容易。在我的腦海裏,我也沒有很好的例子。 ;) – Haatschii

0
TheClass** foo[10]; 

這行代碼告訴編譯器一個製造陣列稱爲pointer to (pointer to Theclass)類型的10種元素的foo

一般來說,當你想弄清楚一個涉及多個星體的&符號的類型。從左至右閱讀。所以我們可以突破上述代碼是這樣的:

( (Theclass) * ) * foo[10] 
     ^ ^ ^^^
      5  4  3 2 1 

#1 an array of 10 elements named #2 foo #3 of type pointer #4 to pointer #5 to Theclass 
1

那麼我看到你的目標是完整的答案,我會給你一個簡單的例子。

如果你定義一個指針數組的指針,就像在你的「類Foo ** [10]」的例子,讓我們說:

int numX = 100; 
int numY = 1000; 

Node **some[10]; 
    some[0] = new Node*[numX]; 
    some[0][0] = new Node[numY]; 

那麼它的意思是:

你第一級有10個節點**。所以你有10個指針來鍵入Node **,但是它們並沒有指向任何有用的地方。

這只是存儲指針的10個相鄰存儲位置。在這種情況下,它們指向的內容無關緊要,主要是隻有10個包含指針空間的字段。

然後在第一個的這些10「空間」並分配100個的指針數組的地址類型的節點*

some[0] = new Node*[numX]; //numX = 100 

這樣做是和運行時期間評估,所以u可以使用的可變值由用戶輸入或某些應用程序邏輯給出,定義數組的維度(即存儲區域)。

現在,您有10個指針中的1個指向指向Node *的100個指針,但仍指向黑洞。

在最後一步中,創建1000個節點類型的對象,並將它們的地址附加到100個指針中的第一個。

這樣你:

some[0][0] = new Node[numY]; //numY = 1000 

在上述示例中,這意味着,只有[0] [0] [0] [0] [0] [999]是目的,1000你創建可以用指定的類型構建多維數組。使整個事情起作用的是,你在最後一個維度實例化你需要的(3)並創建指針來唯一索引從[0] [0] [0]到[9] [99] [999]創建的每個字段的索引。 。

some[0][1]; // memory violation not defined 
some[0][0]; // good -> points to a *Node 
some[0][0][0]; // good -> actually points to Node (data) 
some[1][0][0]; // memory violation not defined 

據我所知,最經常使用的一維數組和一些微小的數學模擬二維數組。喜歡說元素[x] [y] = [x + y * width];

然而,你想使用你的記憶,最後它歸結爲一些記憶地址和它們的內容。

+0

Aaaaah,我現在明白了:D謝謝! – user1770094

1

指針就是指針。它指向某種東西。期。如果你瞭解的很多,那麼你應該能夠理解一個指針指針是什麼。它只是一個指針,它的值是另一個變量的內存地址,它本身就是指向別的東西的指針。就這樣。每當你將一個*添加到混音中時,它只是另一個指針間接級別。例如:

int i; 
int* p_i = &i; // p_i is a pointer to an int and points at i 
int** pp_i = &p_i; // pp_i is a pointer to an int* and points at p_i 
int*** ppp_i = &pp_i; // ppp_i is a pointer to an int** and points at pp_i 

現在申請該概念TheClass **foo[10];(實際上TheClass** foo[10];從編譯器的角度來看)。它聲明瞭一個名爲foo的數組,其中包含10個指針指向元素。每個TheClass*可能是指向特定TheClass對象的指針,也可能是TheClass元素的動態數組(無需知道沒有更多上下文),則每個TheClass**都是指向特定指針的指針。

+0

總結得非常好。我現在掌握了它。但是現在我想知道爲什麼有人會使用更多的指針。這通常會解決什麼問題? – user1770094

+0

就像我說過的,很難確切地說不知道它被使用的上下文。通常使用指針指針,比如創建一個動態的對象指針數組。但是指針指針數組並不常用。它可以用於的一個領域是查找表。在這種情況下,'foo'可以是一個由10個項目組成的數組,最初包含指向存根的指針的指針,然後指向存根的值可以在應用程序的生命週期的較晚時間換出,而不改變數組的內容本身。 –