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

来源:互联网 发布:阿里云 云市场 编辑:程序博客网 时间:2024/05/01 08:50

#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;//00EEFB5Ccout << &p[4][2] << endl; //00EEFB4Ccout << &p[4][2] - &a[4][2] << endl;//-4system("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所指向的内存到底是什么。解决这类问题的最

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

 

0 1