2017-10-15 50 views
-1

初始化的2D陣列矩陣如下:鑄造2D陣列以雙指針的失敗

for(i=0; i<N; ++i) 
{ 
    for(j=0; j<N; ++j) 
     printf("%d ", *(*(matrix + i) + j)); 
    printf("\n"); 
} 

然而下面的代碼失敗:

#define N 3 
... 
int matrix[N][N] = {}; 

的矩陣的元素可以如下訪問一個分段錯誤

int **matrix_pointer = (int **)matrix; 
for(i=0; i<N; ++i) 
{ 
    for(j=0; j<N; ++j) 
     printf("%d ", *(*(matrix_pointer + i) + j)); 
    printf("\n"); 
} 

請解釋爲什麼或建議有效的替代方法(帶指針)。

+2

[A「2d數組」與指向指針的指針不同)(https://stackoverflow.com/a/18440456/440558) –

+1

在C中投射大多數不是成功的方式,而只是沉默編譯器。 – alk

+2

因爲它應該。數組不是指針,反之亦然。不要試圖解決類型系統問題。 – StoryTeller

回答

0

如果定義

int matrix[3][5]; 

添加然後把剛剛matrix= - 運算符的右側,排列matrix衰減(因爲每個陣列會做),以它的地址的第1個要素。

matrix的第一個元素是int[5]int[5]的地址是int(*)[5]

要當「把剛剛matrix到的= - 運算符正確的」,那麼這種賦值操作的左邊是希望成爲一個int(*)[5]

int (*row)[5] = matrix; 

瞭解它上面很明顯,做

int ** ppi = matrix 

不能正確爲int **int(*)[5]不一樣。

它從另一個不同的指針指向一個指針,會說不兼容的類型。編譯器會警告這一點。

對右側表達式應用轉換以適合左側,只是告訴編譯器關閉。