码迷,mamicode.com
首页 > 编程语言 > 详细

例看二维数组,指针,二维数组指针

时间:2015-02-14 17:33:01      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:c语言   指针   数组   

例程:

/******************************************************
*
* 文件名:例程
*
* 文件描述:例看二维数组,指针,二维数组指针
*
* 创建人: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)
输出数组。


例看二维数组,指针,二维数组指针

标签:c语言   指针   数组   

原文地址:http://blog.csdn.net/u012993936/article/details/43818005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!