例程:
/******************************************************
*
* 文件名:例程
*
* 文件描述:例看二維數組,指針,二維數組指針
*
* 創建人:Jesse
*
* 版本號:
*
* 修改記錄:
*
******************************************************/
#include <stdio.h>
#define ROW 3
#define LINE 3
void main(void)
{
const int array[ROW][LINE] = { //array 是一個指向 int [LINE] 的指針
{11,12,13},
{21,22,23},
{31,32,33}
};
unsigned char row, line;
const int *pr = NULL; //int *pr 是一個指向 int * 的指針
const int (*arrpr)[LINE] = NULL; //int (*arrpr)[ROW] 是一個指向 int [LINE] 的指針,與 array 同類型
const int **dpr = NULL; //int **dpr 是一個指向 int* 的指針,與 &pr 同類型。
// 二維數組值
printf("// 二維數組值:array[row][line] //\n");
for(row=0; row<ROW; row++)
{
for(line=0; line<LINE; line++)
printf("row:%d,line:%d,value:%d ", row, line, array[row][line]);
putchar('\n');
}
}
打印出的結果爲:
下面我們用單層指針來輸出二維數組的值:
// 指針與二維數組值
pr = array; //強制將array(int [LINE])的類型轉化爲(int *)的類型。PS:自加1的時候加的是sizeof(int)而不是3*sizeof(int)了。
for(row=0; row<ROW; row++)
{
for(line=0; line<LINE; line++)
printf("row:%d,line:%d,value:%d ", row, line, *(pr+row*3+line));
putchar('\n');
}
pr = array; 將雙層指針強制轉換爲單層指針,這是pr自加1加的是 sizeof(int),又因爲數組存儲在一連續的堆棧中,所以用 *(pr+row*3+line) 可以輸出數組的值。
下面我們用二維數組指針來輸出二維數組的值:
// 二維數組指針與二維數組值
arrpr = array; //arrpr 與 array 屬於同一類型的指針
printf("// 二維數組指針與二維數組:arrpr[row][line] //\n");
for(row=0; row<ROW; row++)
{
for(line=0; line<LINE; line++)
printf("row:%d,line:%d,value:%d ", row, line, arrpr[row][line]);
putchar('\n');
}
arrpr = array; 相當於將二維數組指針賦給另一個二維數組指針。所以 arrpr 可以和 array 一樣使用:arrpr[row][line]
下面我們用二層指針來輸出二維數組的值:
// 二層指針與二維數組值
//方法一:
printf("// 二層指針與二維數組:*(*dpr+line) //\n");
for(row=0; row<ROW; row++)
{
pr = array[row];
dpr = ≺
for(line=0; line<LINE; line++)
printf("row:%d,line:%d,value:%d ", row, line, *(*dpr+line));
putchar('\n');
}
//方法二:
printf("// 二層指針與二維數組:**dpr //\n");
for(row=0; row<ROW; row++)
{
for(pr=array[row]; pr-array[row]<LINE; pr++)
printf("row:%d,line:%d,value:%d ", row, line, **dpr);
putchar('\n');
}
之前我試過用
dpr = array; //強制將array(int [LINE])的類型轉化爲(int *)的類型
無論是用 pr 的輸出方法輸出,還是用 arrpr 的輸出方法輸出,得到的都是錯誤的結果。
int **dpr 類型的變量不能直接接受二維數組的地址,對於二維數組來說,dpr 相當於 int (*arrpr)[ ] 類型的指針,沒有指明包含了多少int類型,是錯誤的。
所以第一層指針必須得指明寬度:
pr = array[row];
第二層指針再指向第一層指針:
dpr = ≺
然後在用:
*(*dpr+line)
輸出數組。