指针与多维数组(2)

因为指针与数组的结合产生了很多有趣的东西,所以接着来看看多维数组与指针之间的关系,看看指针数组和数组指针!!

指针数组:int * as[10];

数组指针:int (*as)[10];

[]的作用:
1.定义变量时有[],代表定义的是数组;
2.参数传递时有[],代表传递的是指针;
3.地址的右边时[],代表的是下标访问;

#include <stdio.h>
int main()
{
	int as[2][3]={{1,2,3},{4,5,6}};
	int (*p)[2][3]=&as;
	/*
	p==&as;
	*p==as==&as[0];  int (*)[3]
	**p==as[0]==&a[0][0];  int *
	***p==as[0][0]
	*/

	printf("%d\n",as[0][0]);//1
	printf("%d\n",**as);//1
	printf("%d\n",***p);//1


	printf("%d\n",as[1][2]);   //6
	printf("%d\n",*(*(as+1)+2)); //6
	printf("%d\n",*(*(*p+1)+2));//6 
	printf("%d\n",*(**(p+1)-1));//6

	return 0;
}

定义数组指针非常简单:看数组什么类型的,把数组名换成指针就可以了!!!

例如:

int as[1][2][3][4][5][6][7][8][9][10];

看到这么大个数组是不是有点儿害怕,不用怕;

下面来定义该类型的数组指针;

int (*pp)[1][2][3][4][5][6][7][8][9][10]=&as;

对,就这么简单,不用怀疑!!为什么是10维,因为编译的时候好像最多就支持10维,在VS6上运行通过,11就不行了,其实在我看来,并没有多维,都是一维,一维里包含了一维,一维里包含了一维,嵌套而已,因为内存里的存储都是连续线性的!!!个人理解!!

为了能更加直观的描述它们之间的区别,补上一段代码和一张图,一目了然:

代码:

#include <iostream>
using namespace std;
int main()
{
	int array[2][2][2]={1,2,3,4,5,6,7,8};
	int (*p)[2][2][2]=&array;
	int (*p1)[2][2]=array;
	cout<<sizeof(array)<<endl;
	cout<<sizeof(&array)<<endl;
	cout<<array<<endl;
	cout<<&array<<endl;
	cout<<array+1<<endl;
	cout<<&array+1<<endl;

	cout<<array[0][0][0]<<" "<<&array[0][0][0]<<endl;
	cout<<array[0][0][1]<<" "<<&array[0][0][1]<<endl;
	cout<<array[0][1][0]<<" "<<&array[0][1][0]<<endl;
	cout<<array[0][1][1]<<" "<<&array[0][1][1]<<endl;

	cout<<array[1][0][0]<<" "<<&array[1][0][0]<<endl;
	cout<<array[1][0][1]<<" "<<&array[1][0][1]<<endl;
	cout<<array[1][1][0]<<" "<<&array[1][1][0]<<endl;
	cout<<array[1][1][1]<<" "<<&array[1][1][1]<<endl;

	system("pause");
	return 0;
}
运行结果:


详细分析如下图


下面来看一个有趣的问题:

as[3][3];如果要输出as[1][2],将其转化为指针如下:

(*(as+1))[2]----->*(*(as+1)+2)

as[m][n][p][q][r][s];

怎么样用指针来转化他们呢,一层一层拨开他们的皮,最后全部变成指针呢:

(*(as+m))[n][p][q][r][s];

(*(*(as+m)+n))[p][q][r][s];

(*((*(*(as+m)+n))+p))[p][q][r][s];

.

.

.

一直往下拨开就可以了,,记住 *+地址就是间接引用某个空间,对其进行读,取,写操作;



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值