二維陣列作函式引數
阿新 • • 發佈:2018-12-24
第一種函式形參的寫法:
#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;
}