C中的二維陣列列印
阿新 • • 發佈:2019-02-12
簡單的列印一個二維陣列,區分指向陣列的指標(陣列指標)和指標構成的陣列(指標陣列)
#include <stdio.h> void printAry( int (*a)[3], int num ) /* 注意,這裡的3會被編譯器記住,表示指標所指數的第一維的大小 */ { int i = 0; int j = 0; for ( i = 0; i < num; i++ ) { for ( j = 0; j < 3; j++ ) { printf( "%4d ", a[i][j] ); } printf( "\n" ); } } void printAry2( int *a, int num ) { int i = 0; int j = 0; for ( i = 0; i < num; i++ ) { for ( j = 0; j < 3; j++ ) { printf( "%4d ", *(a + i * num + j) ); } printf( "\n" ); } } void printAryInd( int * a[3], int num ) /* 注意,這裡的3並不起任何作用,並不表示所傳陣列的大小,陣列的大小由num指定 */ { int i = 0, j = 0; for ( i = 0; i < num; i++ ) { for ( j = 0; j < 3; j++ ) { printf( "%4d ", a[i][j] ); } printf( "\n" ); } } void printAryIndTwo( int ** a, int num ) { int i = 0, j = 0; for ( i = 0; i < num; i++ ) { for ( j = 0; j < 3; j++ ) { printf( "%4d ", a[i][j] ); } printf( "\n" ); } } int main() { int a[2][3] = { 1, 2, 3, 11, 22, 33 }; int *b[3]; int *c; int i = 0; for ( i = 0; i < 2; i++ ) { b[i] = a[i]; } c = (int *) a; printAry( a, 2 ); printf( "%s\n", "--------------" ); printAry2( c, 2 ); /* 可以強轉成一個一維陣列 */ printf( "%s\n", "--------------" ); printAryInd( b, 2 ); /* 這裡只給陣列前兩個元素賦過值 */ printf( "%s\n", "--------------" ); printAryIndTwo( b, 2 ); }
當實參是二位陣列a[2][3]時,形參用(*arr)[3]指向陣列的指標可行,而用*arr[3]指標陣列執行為什麼不能得到正確結果呢?
因為int (*arr)[3] 作為引數在和形參a[2][3]結合時,arr 是一個數組的指標,也就是指向 &a[0] 的地址,這個陣列每個元素都 是 int [3]型別的一維陣列 ,所以可以用二維陣列首地址來作為形參。
而 int *arr[3]表示arr是一個數組的首地址,這個數組裡儲存的元素是3個int * 型別的指標元素。 當形參為int *arr[3]時,這裡的3並不起任何作用,並不表示所傳陣列的大小,陣列的大小由引數num指定。
直接用陣列a[2][3]首元素作為形參時,系統會報資料型別不匹配的錯誤。如果硬要呼叫printAryInd函式,則可以先定義一個 int *b[3],要這樣賦值才行,int * b[3]={a[0],a[1],NULL} 不能直接傳二維陣列的首地址。