2017-02-15 127 views
-1

非常基本的問題。訣竅是數組被定義爲二維數組。使用C中的指針打印數組的值

int main(){ 
    int mat[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    int index; 
    for (index = 0; index < 9; index++){ 
     // only change code below this line 
     // print the value at this index using pointer arithmetic 

     //below is my code 
     printf("%p\n", *(&mat + index)); 
    } 
    return 0; 
} 

我是新來的指針。據我所知,'&'指針指向地址,*指針指向該地址的值,對吧?

輸出應該是一個獨立的行

+2

'&mat + index'是未定義的行爲,除非'index == 0'或'index == 1'。 '*(&mat + index)'是未定義的行爲,除非'index == 0'。 'printf(「%p \ n」,*(&mat + index));'總是未定義的。 – EOF

+0

使用'printf(「%d \ n」,*((int *)&mat + index));'獲得預期的行爲 –

回答

0

整數1-9看來你指的是以下

#include <stdio.h> 

#define N 3 

int main(void) 
{ 
    int mat[N][N] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; 

    for (int i = 0; i < N * N; i++) 
    { 
     printf("%d ", *(*(mat + i/N) + i % N)); 
     if ((i + 1) % N == 0) printf("\n"); 
    } 

    return 0; 
} 

輸出是

1 2 3 
4 5 6 
7 8 9 

另一種方法是重新詮釋二維數組作爲一維數組。

#include <stdio.h> 

#define N 3 

int main(void) 
{ 
    int mat[N][N] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; 

    for (int i = 0; i < N * N; i++) 
    { 
     printf("%d ", *((int *)mat + i)); 
     if ((i + 1) % N == 0) printf("\n"); 
    } 

    return 0; 
} 

如果你需要所有的整數將在一行輸出然後只是刪除if語句。