数组的地址结构
对于如下定义的二维数组结构,其首地址是1000位置,按照字节编址
每一个int类型,占用4个字节
int a[3][4];
其地址结构下图所示:
也就是,a[0]指向的是一个长度为4的一维数组
两种相似结构的区分
指针数组和指向数组的指针两者之间有所区别
指针数组:
char *fp[2];
(char *)(fp[2]);
(其中[]的优先级,比*的优先级要高,所以上面的fp名称会优先跟[]相结合)
fp指向一个长度为2的数组,每个单元里都存有一个指针
对于这样的指针数组,可以用于存放单个的整形变量地址
也可以用于存放一个一维动态数组的地址
#include <iostream>
using namespace std;
int main()
{
int *p[2];
int a = 4;
p[0] = &a;
p[1] = new int[2]; //有分配,就一定要有对应的回收
p[1][0] = 5;
p[1][1] = 6;
cout << "p[0]=" << p[0] << endl;
cout << "*p[0]=" << *p[0] << endl;
cout << "p[1][1]=" << p[1][1] << endl;
delete[] p[1]; //务必记住要进行内存回收
return 0;
}
/*
p[0]=0x7ff7b434e4b8
*p[0]=4
p[1][1]=6
*/
- 指向指针数组的指针
char **fp;
指向指针数组的指针,相当于是指向指针数组首位元素的指针
也就是二阶指针了
指向数组的指针
char (*fp)[3];
这里的fp与*结合, 共同指向类型为char[2]
的数组
这就是个典型的指向一维数组的指针,可以将一个有3列的矩阵赋给该指针
#include <iostream>
using namespace std;
int main()
{
int (*fp)[3];
int a[2][3]={{1,2,3},{4,5,6}};
fp=a;
cout<<fp[1][0]<<endl;
cout<<fp[1]<<endl;
cout<<fp<<endl;
return 0;
}
/*输出结果
4
0x7ff7b4d0b4cc
0x7ff7b4d0b4c0
*/
另外还能定义指向多维数组的指针
int(*p)[B][C] = new int[A][B][C];
在定义之前,必须先设定好,除了行数之外的,其他参数
可以将p指针的类型,看做int[B][C]
,也即一个二维数组
也就是这个数组的每一个元素都是代表着一个一个二维数组
我们对这个数组进行动态分配内存,也必须要每次分配一个固定大小的内存空间