2017-10-15 52 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]不一样。

它从另一个不同的指针指向一个指针,会说不兼容的类型。编译器会警告这一点。

对右侧表达式应用转换以适合左侧,只是告诉编译器关闭。