int data[3][4]= {{1,2,3,4},{1,2,3,4},{1,2,3,4}};
定義了一個三行四列的數組
這個二維數組可以解釋為:
有3個指向數組的指針, 每個指針指向一個 數組, 每個數組包含 4 個int 元素.
假如此時有一個sum 函數, 作用是計算這個二維數組的和
那么調用sum函數時, 代碼應為 sum( data , int size);
那么 sum函數的原型是什么呢:
原型如下: (原型即函數的定義)
int sum(int (*ar2)[4] , int size );
為什么將二維數組作為形參時, 只有第一個方括號需要用符號表示, 而第二個方括號用具體的常量表示呢?
原因如下:
當 代碼寫出int data[3][4]時, data就會被認為是一個數組的指針, 指向一整個含有四個元素的數組. 這樣的數組共有3個
當理解了上面的這兩句話之后, 就可以理解為什么sum需要這樣調用了
ar2 是一個指向數組的指針, data也是指向數組的指針, 所以調用sum函數時, 可以直接傳遞data作為實參 , size 就是data數組的長度, 就是3
其中, 括號不能少, 如果少加一個括號, 變為 int *ar[4] 代碼的意義將有很大的改變, 此時代碼的意義為:
只有一個數組, 這個數組的內容是 四個 int* 指針.
可以形象的理解為 | int* | int* | int* | int* |
而int (*ar2)[4] 的意思為:
| 含有四個int元素的數組 | 含有四個int元素的數組 | 含有四個int元素的數組 | 含有四個int元素的數組 |
為了更加便於理解, 可以將int sum(int (*ar2)[4] , int size ); 改寫為
int sum(int ar2[][4] , int size );
這樣寫的可讀性更強. 可以輕松的理解為, 這是一個二維數組, 只是行數沒有指定, 值為空, 數組名為ar2, 而數組的實際長度, 需要由size 指定.
但是不論哪一種寫法 , 他們都有相同的意義:
ar2是指針, 而不是數組 !