2013-03-06 190 views
1

我想將2D數組傳遞給函數。我嘗試了互聯網上提供的不同解決方案。陣列差異之間的區別

int arr[3][4]; 
fun (arr); 



1) void fun(int *a[4]) {} -- result into a compilation error (cannot convert int (*)[4] to int **) 

2) void fun(int(*a)[4]) {} -- works fine. 

我想知道上述兩個聲明之間的區別是什麼以及1. case中有什麼錯誤。

+0

請編輯您的代碼,這既不是C也不是C++! – 2013-03-06 15:56:23

+1

'int arr [3] [4]'會退化爲int *',而不是'int **'! – 2013-03-06 15:58:25

+0

其中的一個需要一個「int」指針數組(大小在衰減期間丟失),另一個指針指向一個包含四個值的int數組。他們是完全不同的野獸。 – WhozCraig 2013-03-06 15:58:35

回答

0
  1. int* a[4]是4 int*小號
  2. int (*a)[4]的陣列的指針4 int小號

陣列的陣列的名稱可以被轉換爲一個指針到它的第一個元素。這是arr,因爲它是int[3][4]的名稱,將被轉換爲指向arr的第一個元素,該元素本身就是int[4]。該類型是int(*)[4]。這就是爲什麼你可以在第二種情況下通過arr

在C++中,可以傳遞一個參考全陣列像這樣:

void fun(int(&a)[3][4]) {} 

在這種情況下,不發生陣列到指針轉換。你只是簡單地參考二維數組本身。

0

int *a[4]是指向int的4個指針的數組,而int(*a)[4]是指向數組4 int的指針。

由於陣列衰減到一個指向它的第一個元素(只要它不是用作&sizeof_Alignof操作數),a[3][4]將被轉換爲(*a)[4]

5

嗯,這裏就是不斷有幫助cdecl說一下吧:

  • int *a[4]意味着「聲明爲指針數組4爲int」
  • int(*a)[4]意味着「聲明爲指針,數組4 INT」
+1

確定那個視線岩石。 – WhozCraig 2013-03-06 16:02:17

+0

感謝您的鏈接。可能有用! – Joze 2013-03-06 16:03:04

+0

但是在函數參數聲明中,'int * a [4]'表示將'a'聲明爲指向'int'的指針。這在問題的背景下很重要。 – 2013-03-06 16:27:45

1

這聲明一個陣列的4個指針爲整數

int* a[4];  // (a) 

此,在另一方面:

int (*a)[4]; // (b) 

聲明一個指針4點的整數陣列。

由於陣列衰變到作爲函數參數使用時,傳遞int arr[3][4]類型的一個目的是,它接受類型(b)中的參數的函數指針(其第一個元素)上述將會成功(衰減的指針int[4],即int (*)[4]),而當參數類型爲(a)時,它將失敗。

0

除了當它是的sizeof_Alignof操作數,或一元&運營商,或者是一個字符串被用來在聲明初始化另一個數組,類型「的T N元件陣列」的表達將被轉換爲「指向T的指針」類型的表達式,並且表達式的值將是數組中第一個元素的地址。

在函數調用

fun(arr); 

表達式的類型arr是「的int 4-元件陣列的3元素數組」。由於arr不是sizeof,_Alignof或一元&運算符的操作數,因此它將被轉換爲類型爲「指向4個元素的數組的int」的表達式,其被寫爲int (*arr)[4],其值將是地址的a[0]

後綴運算符等[]()具有比一元運算符等*更高的優先級,所以*a[N]是一個指針N - 元素陣列,而(*a)[N]是一個指向N - 元素數組。同樣,*f()是返回指針的函數,而(*f)()是指向函數的指針。