2015-09-07 33 views
1

我正在嘗試使用指向間接級別二的額外指針的三個級別的指針間接尋址。這是一堂課,我有一些真正的問題。這就是我正在做的。與數組間的指針間接尋址

int ***s = new int **[row]; 
*s = new int *[row]; 
**s = new int[row]; 

現在,如果這些那裏只是詮釋,而不是陣列我能做的,

***s = 1; 

若要將其存儲到我的圖中,黃色正方形,但我不知道如何訪問數組元素,我嘗試了幾件事情,它崩潰或不會編譯。任何幫助,甚至指引我朝着正確的方向將是非常有用的。謝謝。

pointer diagram

+0

不知道你到底想要什麼。你在尋找一個3d陣列嗎? –

+0

結束遊戲是一個二維數組,並且具有充滿指針的垂直數組和充滿變量的列。 – Mishap

+1

爲什麼不使用'int matrix [x] [y]'來初始化一個二維數組?我不明白你的意思是'垂直數組充滿指針'。 –

回答

2

您已經創建了這樣的事情(假設row是2和類型T):

 
          T*** 
          +-----+ 
          |  | 
          +--/--+ 
          /
         /T** 
         +--/--+-----+ 
         |  |  | 
         +-----+--+--+ 
         -/  | 
        --/  T* | 
       +--/--+-----+ +-+---+-----+ 
       |  |  | |  |  | 
       +-----+-----+ +--+--+-----+ 
      ----/  -/  |  \--- 
     -----/  --/  T |   \-- 
    +--/--+-----+ +--/--+-----+ +--+--+-----+ +--\--+-----+ 
    |  |  | | X |  | |  |  | |  |  | 
    +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ 

每個節點都將指向下一級別的第一個節點。取消每個級別的引用會爲下一級提供級別,但是您還需要處理要訪問的數組中元素的索引。我看到,這不是在你的代碼中完成的。對於標量,您可以使用*解除引用,而對於數組,索引語法的解引用與選擇正確的元素不同。數組上的*只會讓你始終保持第一個元素。

要訪問X上圖中你會做

T** v = u[0]; 
T* w = v[1]; 
T x = w[0]; 
// shorthand for above 
x = u[0][1][0]; 

要只需要在最後一個級別的數組,你應該做這個

int*** p = new int**; 
*p = new int*; 
**p = new int[row]; 

這只是給你█ →█→█→███...,其中p本身(第一個盒子)是一個自動變量(通常存儲在堆棧空間中),休息來自freestore(通常存放在堆中)。

Live example

+0

Jeez。這是設置這個間接數組的唯一方法嗎? – Mishap

+0

爲了清晰起見,我展示了每一步,現在添加更短的版本。 – legends2k

+0

我開始認爲我在做這個任務是非常錯誤的。不能,我只是在黑色框中設置了int指針,並且在黃色框中的末尾有一個數組? – Mishap

1

假設row = 3這個例子。

int ***s; 
// s=[?] 
// s is an uninitialized variable. 

s = new int **[row]; 
// s[*] -> [?] 
//   [?] 
//   [?] 
// s points to the first element of an array of size 3. 
// The elements are uninitialized. 

*s = new int *[row]; 
// s=[*] -> [*] -> [?] 
//   [?] [?] 
//   [?] [?] 
// We've initialized s[0]. It points to another array of size 3. 
// All elements of that array are also uninitialized, along with s[1] and s[2]. 

**s = new int[row]; 
// s=[*] -> [*] -> [*] -> [?] 
//   [?] [?] [?] 
//   [?] [?] [?] 
// More of the same. s[0][0] is initialized. 
// This last array contains uninitialized ints, not pointers. 

***s = 1; 
// s=[*] -> [*] -> [*] -> [1] 
//   [?] [?] [?] 
//   [?] [?] [?] 
// We traverse three levels of pointers (->) and store 1 in the cell. 

所有這些應該編譯和工作正常(只要你不訪問任何未初始化的元素)。


s + 1指向第一個數組的第二個元素。

// s=[*] -> [*] -> [*] -> [1] 
// s + 1 -> [?] [?] [?] 
//   [?] [?] [?] 

*(s + 1)指細胞[?]指向s + 1圖中的上方。此單元格未初始化。

**(s + 1)試圖取消引用無效的垃圾指針(並且經常崩潰)。

+0

好的,當我嘗試這個時,我使用'cout << ** s [0];'我得到了1,但是當我嘗試存儲一些東西讓我們在下一個偏移量中使用'***(s + 1)= 2;'它不起作用,爲什麼不呢? – Mishap

+0

@Mishap由於'*(s + 1)'(也被稱爲s [1]')仍未初始化,並且不是有效的指針(請參閱我編輯的答案)。 – melpomene