二維數組作函數參數的形式主要有:ios
/對於一個m行n列int元素的二維數組 //函數f的形參形式 f(int daytab[m][n]) {...} //如下兩種能夠忽略行數 f(int daytab[][n]) {...} f(int (*daytab)[n]) {...}
這裏都不能忽略第二維的大小。主要 緣由是二維數組在棧內分配的內存是連續的,它的每一行都有相同的元素,這樣,array[i][j] 和 *(*(array +i) +j)是同樣的,程序是知道array+i的i實際上偏移了i*N個單位,這也致使了在二維數組array[3][3]中,使用下標array[2][1]和array[1][4]是訪問的同一個元素,儘管後者的下標對於一個3*3矩陣來講是非法的,但這並不影響訪問。數組
以指針的指針來表示二維數組,動態分配內存的形式:函數
這樣的方法能夠讓第二維(即每一行)的大小沒必要徹底相等,嚴格來講,並非二維數組,但這也有對應的好處。以這樣分配的內存,能夠直接以指針的指針做爲函數參數,並在子函數中用雙下標直接訪問。spa
#include <iostream> #include <stdio.h> void out(double **a,int m, int n) { int i, j; double b=0.0; for(i=0; i<m; i++) { for (j=0; j<n; j++) { a[i][j] = b; b += 1.2; printf("%5.1f",a[i][j]); } std::cout << std::endl; } } int main(int argc, char * agrv) { int i, j, m=2, n=3; double **a; a = new double*[m]; for (i=0; i<m; i++) a[i] = new double[n]; out(a,m,n); return 1; }