数组那些不为菜鸟所知的秘密(two)

#include<iostream>
using namespace std;
int main1()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	int *p;
	p = a[0];//a[0]相当于a[2]这个数组的数组名
	int(*p1)[2];
	p1 = a;//p1指向整个数组;
	cout << p[0] << endl;//1这里是逗号表达式的坑!!
	//相当于int a[3][2]={1,3,5};
	system("pause");
	return 0;
}


&p[4][2]-&a[4][2]的值是多少?

int main()
{
	int a[5][5];
	int(*p)[4];
	p = (int(*)[4])a;
	cout << &a[4][2] << endl;//00EEFB5C
	cout << &p[4][2] << endl; //00EEFB4C
	cout << &p[4][2] - &a[4][2] << endl;//-4
	system("pause");
	return 0;
}

经过测试,可知&p[4][2]-&a[4][2]的值为-4。这到底是为什么呢?下面我们就来分析一下:


前面我们讲过,当数组名a作为右值时,代表的是数组首元素的首地址。这里的a为二维数组,我们把数组a看作是包含5个int类型元素的一维数组,里面再存储了一个一维数组。如此,则a在这里代表的是a[0]的首地址。a+1表示的是一维数组a的第二个元素。a[4]表示的是一维数组a的第5个元素,而这个元素里又存了一个一维数组。所以&a[4][2]表示的是&a[0][0]+4*5*sizeof(int)+2*sizeof(int)。

根据定义,p是指向一个包含4个元素的数组的指针。也就是说p+1表示的是指针p向后移动了一个“包含4个int类型元素的数组”。这里1的单位是p所指向的空间,即

4*sizeof(int)。所以,p[4]相对于p[0]来说是向后移动了4个“包含4个int类型元素的数组”,即&p[4]表示的是&p[0]+4*4*sizeof(int)。由于p被初始化为&a[0],那么&p[4][2]表示的是

&a[0][0]+4*4*sizeof(int)+2*sizeof(int)

再由上面的讲述,&p[4][2]和&a[4][2]的值相差4个int类型的元素。现在,上面测试出来的结果也可以理解了吧?其实我们最简单的办法就是画内存布局图:


 

 

这里最重要的一点就是明白数组指针p所指向的内存到底是什么。解决这类问题的最

好办法就是画内存布局图。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值