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

例程:

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesse_嘉伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值