這完全不是您如何訪問二維數組的元素。這裏有幾個錯誤。例如,您正在循環使用i
和j
- 但由於您從0
到8
需要使用j
,所以當您達到值i> 0時,您將遇到麻煩。你可以只是做
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int j=0;
int *ptr = &n[0][0];
for(j=0; j<9; j++)
{
printf("%d\t",*(ptr+j)) ;
}
return 0;
}
這是一個有點簡單,但維護你的代碼的本質 - 因爲它是一個指針設置爲陣列的開始,增加此指針。一些變化:
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int j=0;
int *ptr = &n[0][0];
for(j=0; j<9; j++)
{
printf("%d\t",*(ptr++)) ;
}
return 0;
}
或
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int i, j;
int *ptr = &n[0][0];
for(i=0; i<9; i+=3)
{
for(j=0; j<3; j++)
{
printf("%d\t",*(ptr+i+j)) ;
}
}
return 0;
}
,當然還有老待機:
#include <stdio.h>
int main(){
int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
int i, j;
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
printf("%d\t",n[i][j]);
}
}
return 0;
}
看看這些不同的方法對你纔有意義。如果他們不這樣問問題。
編輯一個簡單的修改你的程序表現出更好的東西在你原來代碼中的錯誤是:
#include <stdio.h>
int main(){
int i, j;
for(i=0; i<3; i++)
for(j=0; j<9; j++)
{
printf("i = %d; j = %d; i + j = %d\n", i, j, i+j);
}
return 0;
}
打印出在內環(你試圖的i
和j
值依次打印數組元素)。你得到:
i = 0; j = 0; i + j = 0
i = 0; j = 1; i + j = 1
i = 0; j = 2; i + j = 2
i = 0; j = 3; i + j = 3
i = 0; j = 4; i + j = 4
i = 0; j = 5; i + j = 5
i = 0; j = 6; i + j = 6
i = 0; j = 7; i + j = 7
i = 0; j = 8; i + j = 8
i = 1; j = 0; i + j = 1
i = 1; j = 1; i + j = 2
i = 1; j = 2; i + j = 3
i = 1; j = 3; i + j = 4
i = 1; j = 4; i + j = 5
i = 1; j = 5; i + j = 6
i = 1; j = 6; i + j = 7
i = 1; j = 7; i + j = 8
i = 1; j = 8; i + j = 9
i = 2; j = 0; i + j = 2
i = 2; j = 1; i + j = 3
i = 2; j = 2; i + j = 4
i = 2; j = 3; i + j = 5
i = 2; j = 4; i + j = 6
i = 2; j = 5; i + j = 7
i = 2; j = 6; i + j = 8
i = 2; j = 7; i + j = 9
i = 2; j = 8; i + j = 10
正如你所看到的,你幫我印了太多的元素,和你「脫落的邊緣」,因爲當i + j
> 8,你正在訪問的內存超出其分配。這導致未定義的行爲。但它通常是一件壞事。
我們可以看到你得到的輸出嗎? –