数组的地址结构

对于如下定义的二维数组结构,其首地址是1000位置,按照字节编址

每一个int类型,占用4个字节

int a[3][4];

其地址结构下图所示: alt

也就是,a[0]指向的是一个长度为4的一维数组

两种相似结构的区分

alt

指针数组指向数组的指针两者之间有所区别

指针数组:

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],也即一个二维数组

也就是这个数组的每一个元素都是代表着一个一个二维数组

我们对这个数组进行动态分配内存,也必须要每次分配一个固定大小的内存空间