2012-09-03 31 views
3

試圖讓我的頭繞着一個數組結構,我需要一個適應度函數。它是一個數組的數組:C數組的陣列

double fitness[][2][9][11] 

剛剛從我的理解一個[2] [9] [11]陣列將是一個2×9 11 3維數組。沒關係,但是[]會把我扔掉。這對數組結構有何貢獻?有人可以給我一個示例輸入到這個(或者可能有更小的尺寸,因爲我已經發布的數組會很大)。

非常感謝。

編輯:這是一個功能

+0

這是一個聲明爲函數參數? –

+1

這個聲明符的含義取決於它的用途(即在函數聲明符或變量定義的一部分中)。 –

+1

當你聲明*一個數組變量時,從初始值設定項推斷出最外面的數組範圍。當作爲函數參數傳遞時,數組會衰減到一個指針,所以最外面的數組範圍也是不相關的。 –

回答

2

內將變得更清晰,如果你減少維數。不妨讓我們大膽,刪除所有,但一個維度,並宣佈

extern double foo[]; 

這樣做是聲明不完全類型,數目不詳的雙打的數組。如果給出了明確數量的元素,則類型將完整。不同的是,您不能將sizeof應用於不完整的類型:編譯器無法知道它們的大小,因爲它們很不完整。

現在,如果我們聲明一個數組數組,我們就不能使兩個維都是未知的(如在double foo[][]中)。這是爲什麼?以前,編譯器可以計算foo[42]的位置,因爲它知道double的大小(因爲double是完整類型)。要計算foo[1][42]它必須知道元素類型的大小。換句話說,元素類型必須是完整的。在C中,最右邊的維度變化最快,因此這裏的元素類型由除最左邊的維度以外的所有維度給出:double [42],在您原來的問題中爲double [2][9][11]

在一天結束時,如果不需要整個數組的大小,可以將最左側的維留爲空白。

2

從本質上講,沒有必要知道數組中有多少行。尺寸首先被聲明的原因是爲了使計算機能夠訪問由二維陣列指向的內存位置,它使用以下內容(不確定是否可以查看它的4-D陣列)

地址=基地+((depthindex * col_size + colindex)* row_size +的rowIndex)* Element_Size

所以這裏是一個小例子說,我們有以下

int myArray[2][2]; 
/* put some values in the array */ 
myFunc(myArray); 

然後我們去訪問它在功能類似

void myFunc(int array[][2]) 
{ 
    printf("%d\n", &array[1][1]); 
} 

本質上,對應於myArray [1] [1]的array [1] [1]的地址是使用上面的公式計算的,我們轉到該地址讀取4個字節將其解釋爲整數並將其打印到屏幕。該函數不關心數組中有多少行的原因是C沒有做任何界限檢查它只需要知道如何計算你使用公式給出的任何索引的內存地址如果你看公式行數不需要(行大小基於列數),因此C非常高興能省略方法聲明中的行數,因爲它可以計算沒有這些信息的內存地址