2009-11-17 110 views

回答

5

typedef是你的朋友。

#include <stdio.h> 
typedef int dimension1[20]; /* define dimension1 as array of 20 
           elements of type int */ 
typedef dimension1 dimension2[10]; /* define dimension2 as array of 10 
             elements of type dimension1 */ 

int foo(dimension2 arr[], size_t siz); 

int main(void) { 
    dimension2 dimension3[7] = {0}; /* declare dimension3 as an array of 7 
            elements of type dimension2 */ 
    dimension3[4][3][2] = 9999; 
    dimension3[4][0][12] = 1; 
    dimension3[3][8][18] = 42; 

    printf("%d\n", foo(dimension3, 7)); 

    return 0; 
} 

int foo(dimension2 arr[], size_t siz) { 
    int d1, d2, d3; 
    int retval = 0; 
    for (d3=0; d3<siz; d3++) { 
    for (d2=0; d2<sizeof *arr/sizeof **arr; d2++) { 
     for (d1=0; d1<sizeof **arr/sizeof ***arr; d1++) { 
     retval += arr[d3][d2][d1]; 
     } 
    } 
    /* edit: previous answer used definite types for the sizeof argument */ 
    //for (d2=0; d2<sizeof (dimension2)/sizeof (dimension1); d2++) { 
    // for (d1=0; d1<sizeof (dimension1)/sizeof (int); d1++) { 
    // retval += arr[d3][d2][d1]; 
    // } 
    //} 
    } 
    return retval; 
} 

編輯

我不喜歡使用定類型作爲參數sizeof
我添加了獲取(子)數組大小而不直接指定其類型的方式,而是讓編譯器從對象定義中推斷出正確的類型。


第二編輯

作爲Per Eckman notes的typedef-ING 「裸」 陣列可能是危險的。請注意,在上面的代碼中,我沒有將數組本身傳遞給函數foo。我傳遞一個指向「較低級別」數組的指針。

foo()在上面的代碼中接受指向dimension2類型的對象的指針。 dimension3對象是dimension2類型的元素的數組,,而不是dimension3類型的對象(甚至未定義)。

但請記住Per Eckman的筆記。

4

將它們作爲指針傳遞。

int a[N][M][P]; 

foo(&a[0][0][0]); 

其中foo是

void foo(int*) 

您可能需要傳遞的尺寸一樣,所以在這種情況下,您可能需要:

void foo(int*, int D1, int D2, int D3) 

,並呼籲

foo(&a[0][0][0], N, M, P); 
+0

是在[0] [0] [0]有必要嗎? – 2009-11-17 12:37:31

+0

@Cory,是的,它首先得到第一個int,並將其作爲地址。這就給出了結果表達式類型'int *',而不是象'int(*)[N] [M] [P]'這樣的數組指針。在我看來,這是一個很好的黑客攻擊手段,它可以通過不必處理任何地方的常量來提高程序的清晰度。但它正式不能保證工作,所以小心使用它(不確定會出現什麼問題)。 – 2009-11-17 12:43:18

+0

@Cory,其他的寫法是'&*** a','a [0] [0]'和'** a'。 – 2009-11-17 12:51:37

5

您需要在編譯時定義最左側的所有維度。

#define DIM 5 

void do_something(float array[][DIM][DIM]) 
{ 
    array[0][0][0] = 0; 
    ... 
} 
3

typedef -ing「bare」arrays are dangerous。

試試這個

#include <stdio.h> 

typedef char t1[10]; 

void foo(t1 a) { 
     t1 b; 

     printf("%d %d\n", sizeof a, sizeof b); 
} 

int main(void) { 
     t1 a; 
     foo(a); 
     return 0; 
} 

人們會認爲的sizeof兩個相同類型的變量將返回相同的尺寸 但不是在這種情況下。由於這個原因,將typedef-ed數組包裝在一個結構中是一種很好的做法。

typedef struct { 
     char x[10]; 
} t1; 
+0

+1非常好的提醒 – pmg 2009-11-17 15:06:34