2017-11-11 59 views
2

如果假設我有兩個陣列arr一維數組和brr的2D陣列,我想這些數組作爲輸入傳遞到功能爲什麼作爲輸入參數傳遞給函數的二維數組無法在函數聲明中聲明爲int **?

在一維的情況下:

void fun(int*); OR void fun(int[]); //both declarations are allowed

fun(arr);//call for 1D 

void fun(int *ptr) 
{ 
//function def of 1D 
} 

但在2D陣列的情況下:

void fun(int[][]); //allowed 
void fun(int**); //this is not allowed **WHY so?** 

雖然呼叫和定義類似於前述一維數組

fun(brr);//call 

void fun(int **ptr2) 
{ 
//code 
} 
+2

[數組的數組是*不*相同作爲指針(或指針數組)的指針](https://stackoverflow.com/a/18440456/440558)。 –

+0

相關,如果不是dupe:https://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer –

回答

1

這是因爲通過常規的指針陣列被認爲是合格的指針類型的在很多場合的第一個元素特別是對功能傳遞的參數。

可以諮詢ISO/IEC 9899:2011§6.7.6.3功能說明符(包括原型) - 語義

一個參數的聲明爲 '' 類型的陣列 ''應該調整爲 ''限定類型爲''的指針,其中類型限定符(如果有的話)是 在數組類型派生的[和]中指定的指針。如果 關鍵字static也出現在數組類型 推導的[和]中,則對於函數的每次調用,相應實際參數的值應提供對數組中第一個 元素的訪問,由 大小表達式指定的許多元素。

但是int[][]代替int**類型的聲明是不能互換的,因爲在第一指的是2D陣列,它會被編譯器默默改變爲指針二維數組的第一元素,所述第二種意思是指向int指針的指針,它與2D數組不兼容。

有時人在混亂通過動態定義的僞二維陣列誘導如下:

int **My_2D_array = malloc(sizeof(int *) * 2); //We are allocating 2 pointers to int 
My_2D_array[0] = malloc(sizeof(int)*2); //We allocate the first dimension space 
My_2D_array[1] = malloc(sizeof(int)*2); //We allocate the second dimension space 

在這種情況下,名稱My_2D_array將被稱爲的2個指針的數組的第一個元素的爲int地址,並且使用[]運算符將返回指針數組中的第一個指針。再次將所述操作者[]到剛剛獲得的,並且再次用作INT的的單維陣列的第一元素的地址的指針,將returs一個int:

int my_int = My_2D_array[0][1]; //mimics a bidimensional array, but isn't! 
相關問題