1. 程式人生 > >C中的二維陣列列印

C中的二維陣列列印

簡單的列印一個二維陣列,區分指向陣列的指標(陣列指標)和指標構成的陣列(指標陣列)

#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}  不能直接傳二維陣列的首地址。