2017-02-12 43 views
1

預期的結果是打印與我們輸入的值相同的值,但輸出在第一行之後爲零。將數組傳遞給函數會改變它的值嗎?

#include<stdio.h> 
void display(int *q, int); 

int main() { 
    int i,j,n; 
    int d[50][50]; 
    printf("Input the order\t"); 
    scanf("%d", &n); 

    for (i=0;i<=(n-1);i++) { 
     for (j=0;j<=(n-1);j++) { 
      scanf("%d", &d[i][j]); 
     } 
    } 
    display (d, n); 
} 

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*r + j)); 
     } 
     printf("\n"); 
    } 
} 
+2

編譯器在將它傳遞給'display'後不知道'd'的尺寸。 – goodvibration

+0

搜索如何將多維數組傳遞給C中的函數。例如,請參閱[本文](http://stackoverflow.com/q/16943909/478288)。 – chrisaycock

回答

0

您的函數聲明的參數類型爲int * 。您正在嘗試傳遞類型爲int [50][50]的參數,該參數衰減爲指針類型int (*)[50]。這些指針類型不兼容。語言不支持從int (*)[50]int的隱式轉換。你的代碼不是一個有效的C程序,我相信你的編譯器會告訴你。

一個更有意義的事就是聲明你的功能

void display (int n, int q[n][n]) 

q[i][j] 

訪問數組元素以自然的方式。然而,對於你將不得不使用真正的數組大小爲n(即50你的情況)。如果您想要處理更小的元素子矩陣,則必須單獨傳遞其大小。

但是,如果你真的想用你的「黑客」,你將不得不調用你的函數

display ((int *) d, n); 

時使用顯式類型轉換並牢記您的原始陣列的每行仍然包含50種元素,正如聲明的那樣,不管n的值如何。這意味着在你的函數中,你將不得不使用50作爲行大小乘數

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*50 + j)); 
     } 
     printf("\n"); 
    } 
} 
+0

我真的不知道是誰降低了這個... –

0

display日常假定二維數組是[n][n],而它是[50][50]

您必須將實際的2D陣列尺寸與n並排,display例程無法知道實際的2D陣列尺寸。

你可以動態地聲明您的數組是這樣的:

printf("Input the order\t"); 
    scanf("%d", &n); 
    int d[n][n]; 

,然後避免該警告

test.c:20:18: warning: passing argument 1 of 'display' from incompatible pointer type 
     display (d, n); 

這裏被明確鑄造1D指針(因爲你知道的結構):

display ((int*)d, n); 
+0

這項工作是誰做的? #include void display(int * q,int); int main() { int a [3] [3] = {1,2,3,4,5,6,7,8,9}; display(a,3); } 空隙顯示器(INT * Q,INT R) { INT I,J; (i = 0; i

+0

@NibirPawanDas - 所以不是一個論壇,所以請擺脫這種心態的自己。特別是,帖子並不是爲了便於討論。不要在評論中發佈整個程序,並期望討論它。 – StoryTeller

+0

它的工作原理是因爲您的尺寸匹配!在當前程序中輸入50也可以。檢查我的編輯。 –