例看二維數組,指針,二維數組指針

例程:

/******************************************************
*
* 文件名:例程
*
* 文件描述:例看二維數組,指針,二維數組指針
*
* 創建人: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 = &pr;
		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 = &pr;
然後在用:

*(*dpr+line)
輸出數組。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章