2015-06-02 99 views
1

我想通過將它傳遞給一個函數來打印一個二維數組,但我得到了奇怪的結果。這是我的代碼。C傳遞2D數組到函數,打印結果

#include <stdio.h> 

int main() 
{ 
    int b[2][3] = {{1,2,3},{4,5,6}}; 
    printArray(b); 
    return 0; 
} 

void printArray(int (*ptr)[3]) 
{ 
    int i, j; 
    for(i = 0; i < 2; i++) 
    { 
     for(j = 0; j < 3; j++) 
     { 
      printf("%d\t", *((*ptr+i)+j)); 
     } 
     printf("\n"); 
    } 
} 

然而,輸出

1 2 3 

2 3 4 

我認爲這是值得做我的「J」變量,但我似乎無法找出它。請幫忙。

回答

1

你需要使用引用操作之前應用的加法運算。由於解引用運算符(*)的優先級高於加法運算符(+),因此需要使用括號。

所以,這

printf("%d\t", *((*ptr+i)+j)); 

應該

printf("%d\t", *((*(ptr+i))+j)); 

或更好

printf("%d\t", ptr[i][j]); 

此外,還需要main之前移動功能printArray或提供函數原型之前main像:

void printArray(int (*ptr)[3]); 
+0

感謝您的好解釋! – mib1413456

1

您需要通過3下J之前乘我......

printf("%d\t", *((*ptr+(i*3))+j)); 
0

放棄索引有利於指針,假定矩陣按行存儲(whic通常是這種情況):

#include <stdio.h> 

void printArray(int *); 

int main() 
{ 
int b[2][3] = {{1,2,3},{4,5,6}}; 
printArray((int*)b); 
return 0; 
} 

void printArray(int *ptr) 
{ 
int i, j; 
for(i = 0; i < 2; i++) 
{ 
    for(j = 0; j < 3; j++) 
    { 
    printf("%d\t", *ptr++); 
    } 
    printf("\n"); 
} 
} 

輸出:

1 2 3 
4 5 6 
0

printArray可以參考nb_columnnb_line參數和處理各種2D陣列

#include <stdio.h> 

static void printArray(int *ptr, int nb_columns, int nb_lines) 
{ 
    int i, j; 
    for(i = 0; i < nb_lines; i++) 
    { 
     for(j = 0; j < nb_columns; j++) 
     { 
      printf("%d\t", *(ptr++)); 
     } 
     printf("\n"); 
    } 
} 
int main() 
{ 
    int b[2][3] = {{1,2,3},{4,5,6}}; 
    printArray((int *)b, 3, 2); 
    return 0; 
} 
+0

將int(*)[3]'轉換成int *'安全嗎? –