2011-08-23 61 views
4

我正在嘗試C中指向多維​​數組的指針的概念。假設我想通過函數處理多維數組。代碼有點看起來是這樣的:多維數組的指針如何在C中工作

#include <stdio.h> 

void proc_arr(int ***array) 
{ 
    // some code 
} 

int main(int argc, char **argv) 
{ 
    int array[10][10]; 
    for(int i = 0; i < 10; i++) 
    { 
     for(int j = 0; j < 10; j++) 
     { 
      array[i][j] = i * j; 
     } 
    } 

    proc_arr(&array); 

    return 0; 
} 

的問題是,當我想訪問arrayproc_arr,我不能。從我的理解,我們應該獲得這樣說:

void proc_arr(int ***array) 
{ 
    (*array)[0][1] = 10; 
} 

所以我derefer的array告訴我要到該地址並獲得價值編譯器。但不知何故,它崩潰。我試過*和括號的幾種組合,但仍然無法使其工作。我很確定這是因爲我不瞭解指針和指針指針。

哦,我注意到,如果我們使用char **(字符串數組)也是如此,就像argv和envp一樣。但對於envp,我以某種方式可以通過(*envp)訪問它。爲什麼?

下面是procces envp的函數(工作):

int envplen(char ***envp) 
{ 
    int count = 0; 

    while((*envp)[count] != NULL) 
    { 
     count++; 
    } 

    return count; 
} 

而且,我可以採用某種訪問envpenvplen功能只有envp,但仍通過引用傳遞嗎?

以前感謝。

回答

8

問題是因爲在堆棧上分配的int array[10][10]沒有按照您認爲的方式佈置內存。這是因爲數組不是指針。內存仍然以線性陣列布局,而不是「二維」陣列,即使這是下標可能表示的內容。換句話說,對於int array[10][10]內存如下所示:

starting address:         ending address: 
| Block_1 of 10 int | Block_2 of 10 int | ... | Block_10 of 10 int | 

所以,當你隱式數組轉換爲int***,然後嘗試訪問數組一樣(*陣列)[1] [10]這是什麼真正轉化爲有點像*(*((*array) + 1) + 10),併爲這樣的操作的存儲器佈局希望看到內存設置如下所示:

int*** array 
| 
| 
| Pointer | 
| 
| 
| Pointer_0 | Pointer_1 | ... | Pointer 10 | 
     |   |     | 
     |   |     | Block of 10 int | 
     |   | 
     |   | Block of 10 int | 
     | 
     |Block of 10 int| 
+1

好吧,我想我明白了:數組不是指針。謝謝。 – bertzzie

2

這是行不通的:

void proc_arr(int ***array) 
{ 
    (*array)[0][1] = 10; 
} 

因爲在幕後編譯器必須將其更改爲相對於數組起始的內存偏移量。這意味着它需要知道數組的尺寸。你還沒有在函數簽名中聲明它們。

4

您有類型不匹配。鑑於聲明int array[10][10],表達式&array的類型將是int (*)[10][10],而不是int ***。如果您將功能原型更改爲

void proc_arr(int (*array)[10][10]) 

那麼您的代碼應該按寫入方式工作。

下表顯示了給定特定聲明的各種數組表達式的類型。

 
Declaration: T a[M]; 

Expression  Type    Decays To   
----------  ----    ---------   
     a  T [M]    T *    
     &a  T (*)[M]     

     *a  T       
     a[i]  T       

Declaration: T a[M][N]; 

Expression  Type    Decays To   
----------  ----    ---------   
     a  T [M][N]   T (*)[N]   
     &a  T(*)[M][N] 
     *a  T [N]    T * 
     a[i]  T [N]    T * 
     &a[i]  T (*)[N] 
     *a[i]  T 
    a[i][j]  T 

Declaration: T a[M][N][O]; 

Expression  Type    Decays To   
----------  ----    ---------   
     a  T [M][N][O]  T (*)[N][O] 
     &a  T (*)[M][N][O]  
     *a  T [N][O]   T (*)[O] 
     a[i]  T [N][O]   T (*)[O] 
    &a[i]  T (*)[N][O]  
    *a[i]  T [N]    T * 
    a[i][j]  T [N]    T * 
    &a[i][j]  T (*)[N] 
    *a[i][j]  T 
a[i][j][k]  T 

高維數組的模式應該清楚。