2011-09-02 139 views
-2

儘管我們用一個整數數組聲明瞭一個函數,但是我們將該數組的地址傳遞給該函數。在簡單整數的情況下,如果我們傳遞地址,我們會得到指針轉換錯誤,這會導致錯誤。但如何其可能在一個陣列將數組傳遞給函數C

#include<stdio.h> 
void print_array(int array[][100],int x, int y); 
main() 
{ 
    int i,j,arr[100][100]; 
    printf("Enter the array"); 
    for(i=0;i<2;i++) 
    { 
     for(j=0;j<2;j++) 
     { 
      scanf("%d",&arr[i][j]); 
     } 
    } 
    print_array(arr,i,j); 

} 

void print_array(int array[][100],int x,int y) 
{ 
    int i,j; 
    printf("\nThe values are\n"); 
    for(i=0;i<x;i++) 
    { 
     for(j=0;j<y;j++) 
     { 
      printf("%d",array[i][j]); 
     } 
    } 
} 

我的問題是,即使作爲第一個參數(在這裏)我們傳遞數組地址,當我們調用函數我們的函數聲明爲一個整數數組的情況下。它如何運作?

+1

你得到什麼樣的錯誤?這是一個沒有錯誤的代碼示例:https://www.ideone.com/CAEoi。事實上,我可以運行您編寫的代碼,並且可以從您的代碼片段獲得我期望的https://www.ideone.com/3z1JO –

+0

,因爲您使用的是x和y,所以最終會傳遞2那些在你正在讀取值的for循環中。你也只是用數據初始化[0] [0],a [0] [1],a [1] [0],a [1] [1],數組的其餘部分將會是垃圾(好處是你只打印你初始化的東西)。 – pstrjds

+0

@pstrjds我的問題不是關於獲取錯誤。它關於其工作背後的邏輯。問題現在已更新。希望它現在更清晰 – user567879

回答

-1

您正在傳遞數組,而不是其地址。 arr是一個int [] []數組 (實際上,它與&(arr[0])相同,它是指向數組第一行的地址的指針(在C中),數組之間沒有實際的區別和相應的指針,除非你把它與&運營商地址)

編輯:好的,只是爲了讓我明白:

#include <stdio.h> 

int fn(char p1 [][100], char (*p2)[100]) 
{ 
    if (sizeof(p1)!=sizeof(p2)) 
    printf("I'm failed. %i <> %i\n",sizeof(p1),sizeof(p2)); 
    else 
    printf("Feeling lucky. %i == %i\n",sizeof(p1),sizeof(p2)); 
} 

int main() 
{ 
    char arr[5][100]; 
    char (*p)[100]=&(arr[0]); 
    fn(arr, arr); 
    fn(p, p); 
    return 0; 
} 
+1

'int [] []'不是有效的類型。 'int [] [100]'是,這是他正在使用的。並且數組衰減成'&(arr [0] [0])'(你關於第一個元素的地址的提示是正確的,你只是缺少一個索引)。 –

+0

是的,我的意思是int [] [n],但是因爲n在這裏是不相關的,所以我省略了,因爲這不會影響解釋。索引不失蹤。 arr _is_等於&(arr [0])。 – vmatyi

+0

* n *並非無關緊要,這對於偏移計算來說是絕對必要的。另外,'&(arr [0])'是無效的,因爲你不能得到一個右值的地址。最後,當你說沒有實際區別時,你錯了。儘管陣列在必要時自動衰減爲指針,但它們完全不同。例如,'sizeof(arr)'不是指針的大小。 –