最近一直在跟二维指针打交道,感觉还是没有把它弄透,因此搞了几个测试观察一下二维指针的特性。
#include <iostream>
using namespace std;
void main()
{
int **ed = new int *[3];
for (int i = 0; i<3; i++)
{
ed[i] = new int[3];
}
for (int i = 0; i<3; i++)
for (int j = 0; j<3; j++)
ed[i][j] = 3*i + j;
cout<<ed<<endl;
cout<<ed[0]<<endl;
cout<<*ed<<endl<<endl;
cout<<ed+1<<endl;
cout<<*(ed+1)<<endl;
cout<<**(ed+1)<<endl;
cout<<ed[1]<<endl;
cout<<ed[2]<<endl<<endl;
cout<<**ed<<endl<<endl;
}
输出的结果是:
00494BC8 ed
00494C10 ed[0]
00494C10 *ed
00494BCC ed+1
00494C58 *(ed+1)
3 **(ed+1)
00494C58 ed[1]
00494CA0 ed[2]
0 **ed
ed存储的是二维数组的首地址,*ed和ed[0]存储的是ed中第一个一个数组的首地址,但是实验显示二维数组的首地址和其第一个一维数组的首地址并不相同。这是为什么呢?
继续试验
int a[2][2]={0,1,2,3};//初始化了a的第一行元素
int **b = (int**)a;
cout<<b[0]<<endl;
cout<<b[1]<<endl;
cout<<b[2]<<endl;
cout<<b[3]<<endl;
这回换了一种方式创建二维指针,先创建一个二维数组,然后将其强制转化为二维指针,并赋于二维指针b。
输出结果为:
00000000
00000001
00000002
00000003
这种复制方法,b[0]并不再是a中第一个一维数组的首地址,而是直接是a中第一个一维数组的第一个元素,b[1]为第一个数组的第二个元素,但是显示出来的结果前面有7个0.
这又是为什么呢?
先写到这,回头有空再仔细分析。