1. 程式人生 > >二維陣列作函式引數

二維陣列作函式引數

第一種函式形參的寫法: 

#include <stdio.h>
#define R 5  // 行數
#define C 5  // 列數
void printMatrix ( int a[ ][C] , int row, int column )  // 使用 int a[R][C] 也可以 , 但是 int a[][] ,就不行!
{
	int i , j;
	for ( i = 0; i < row; i++)
	{
		for( j = 0; j < column; j++)
			printf(" %d\t", a[i][j] );
		printf("\n");
	}	
}
int main()
{
	int a[R][C];
	int i , j;
	int count = 1;
	for ( i = 0; i < R; i++)
		for( j = 0; j < C; j++)
			a[i][j] = count++;	

	printMatrix(a,R,C); //列印二維陣列

	return 0;
}

第二種函式形參的寫法:

#include <stdio.h>
#define R 5
#define C 5
void printMatrix ( int (*a)[C] , int row, int column ) 
......(其他程式碼,同上)

第三種函式形參的寫法:

#include <stdio.h>
#define R 5 
#define C 5
void printMatrix ( int *a , int row, int column ) 
				
{
	int i , j;
	for ( i = 0; i < row; i++)
	{
		for( j = 0; j < column; j++)
			printf(" %d\t", *( (a+(i*column)) + j )  ); 
					                // i*column 是相對陣列首地址的“行偏移”量  ,j 是行內的“列偏移”
		printf("\n");
	}	
}
int main()
{
	int a[R][C];
	int i , j;
	int count = 1;
	for ( i = 0; i < R; i++)
		for( j = 0; j < C; j++)
			a[i][j] = count++;	

	printMatrix( (int *)a, R, C); // 將二維陣列名(陣列首元素地址)強制轉換 為 int *型別, 即轉換為指向整型的指標

	return 0;
}

總結:

1.  在第一種和第二種函式形參列表的寫法中,必須給出二維陣列的第二維的值(即列數),而且必須是常量! !! 

2. 第三中寫法中,注意對陣列名(陣列首元素地址)的強制轉換,將其轉換為普通的整型指標變數!

(因為,二維陣列名雖然代表了一個整型指標,但是這個整型指標的屬性(步長)是 ( sizeof(int) * column )就是 4 * 5 = 20 個位元組 ,見下圖)


//其他程式碼同上
	printf("  a = %d \n", a);		//列印 a的值,即二維陣列首元素的地址
	printf("a+1 = %d \n", a + 1 );	//列印 a+1 的值, 測試 a 的步長



3.  由第2點可以知道,第三種寫法的本質是將一個“二維陣列” 當做一個 “一維陣列” 來操作! (其實,二維陣列,在記憶體中就是按一維形式儲存的! 好吧! 寫個測試程式!)

#include <stdio.h>

int main()
{
	
  int a[3][3] ={	{ 1, 2, 3 },
			{ 4, 5, 6 },
			{ 7, 8, 9 }
		};

  printf("a[2][2] = %d\n", a[1][1] );
  printf("a[0][4] = %d\n", a[0][4] ); //二維陣列(或更高維陣列)是以一維的形式儲存的(實體記憶體單元都是連續的)
  printf("\n");
  printf("*((int*)a + (1*3)+1) = %d\n" , *((int*)a + (1*3)+1) ) ; 
				//同上, (int *)a 是強制轉換,(1*3)是相對首地址的“行偏移”,1是“列偏移”
  return 0;

}