2012-09-14 49 views
7
      |--------|  
//     /|4 4 4 |  
//     |--------| 4 | 
//    /|3 3 3 | 4 | 
//    |---------|3 | | 
//   /| 2 2 2 |3 |/
//   |---------|2 |__| 
//   | 1 1 1 |2 |/
//   | 1 1 1 |__| 
//   | 1 1 1 |/
//   |_________| 
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}}; 

我認爲這個數組由4層組成。使用指向層數組的指針遍歷數組

我想創建指向數組的層,並使用指針遍歷該數組的各個層。

我嘗試:

double (*pp1)[sizeof(arr[0])/sizeof(ar[0][0][0])]; 
pp1 = arr[0]; 

,並得到錯誤的智能感知:類型(雙(*)(3)不能老是被分配到兩倍(*)(9)

+0

快速猜測,你想要'double(* pp1)[sizeof(arr [0])/ sizeof(ar [0] [0])];' – BoBTFish

+0

也是'int!= double'。 – BoBTFish

+0

我需要sizeof(arr [0])/ sizeof(ar [0] [0] [0],它是9(圖層中的元素數)我改變了int double,這是錯誤 –

回答

0
的 值

雖然試圖弄清楚這個問題,我得到了一些成果。

我發現,下面的語句將認爲沒有從編譯器錯誤

double arr[4][4][9]; 
double (*pp3)[9]; 
pp3 = arr[0]; 

那麼,從上面的代碼推導出來,只有在指向的元素的數量等於數組的最小維數的情況下,指針纔可以指定給數組?

更新: 我認爲只能在最小的數組層上創建指針。

有人可以解釋一下嗎?

+2

[This answer](http://stackoverflow.com/a/12385772/968261)可能會有所幫助。 –

+0

@Alexey Frunze-是的,非常感謝信息的好來源。現在我明白瞭如何在數組上使用指針,這在你給我的答案中有相當清楚的解釋。 –

0

爲什麼不簡單地獲取給定圖層的第一個元素的方向?

double *pp1 = &ar[0][0][0]; 
double *pp2 = &ar[1][0][0]; 
/* and so on */ 
+0

這個解決方案將如何幫助我弄清楚指向數組層的指針是如何工作的? –

1

所以,如果你這樣做:

int i; 
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2}, 
         {3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}}; 

double (*pp3)[3][3];  
pp3 = arr;  
for (i = 0; i <= 3; i++)  
{ printf("pp3 + %d is %f \n", i, ***(pp3 + i)); 
} 

然後你得到所期望的行爲。你的代碼的問題在於,就像編譯器告訴你的那樣,你試圖給一個9雙精度的數組賦值(double (*pp1)[sizeof(arr[0]/sizeof(arr[0][0][0])]評估爲double (*pp1)[9]),但是你需要一個指向3數組的指針的指針3 ,這是你用double arr[4][3][3]聲明的內容。在我的測試中,gcc會接受double (*pp1)[9]的編譯器警告,這是我在下面的評論中試圖得到的結果。希望這能說明問題。

如果你想保持這個一般,那麼你真正想要的是double (*pp3)[sizeof(arr[0])/sizeof(arr[0][0])][sizeof(arr[0][0])/sizeof(arr[0][0][0])],這是一個血腥的噩夢。

編輯:忘了解除引用...應該複製/粘貼哈哈。還添加了關於問題代碼行爲的解釋。根據意見修正。

+0

第二個想法是,執行'(* pp3)[3] [3]'是合適的,它是一個指向3的數組3的數組的指針,這就是你所擁有的。原來的(使用'(* pp3)[9]')的作品,但由於我們沒有真正的數組9,我相信這是錯誤來自... – surfreak

+0

如果你想保持這個一般,那麼你真正想要的就是'double(* pp3)[sizeof(arr [0])/ sizeof(arr [0] [0])] [sizeof(arr [0] [0])/ sizeof(arr [0] [0] [0])]',這是一場血腥的噩夢。必須同意使用適當的數據結構......但這會正確地做你所問的。我會將其添加到答案中。 – surfreak

+0

double(* pp3)[3] [3]; pp3 = arr [0];不要編譯。 來編譯代碼,你必須聲明指針爲: double(* pp3)[3] - 因爲arr [0]指向arr的第一個元素,它的維數[3] [3]這個元素,它也指向[3] [3]數組的第一個元素,它是(* pp3)[3]。 Alexey Frunze給出了非常詳細的數組指針使用方法的參考資料,這裏是http://stackoverflow.com/a/12385772/968261 –