一、多维数组元素的地址
设有一个二维数组a,它有3行4列。它的定义为:
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,18,21,23}};
a是一个数组名。a数组包含3行,即3个元素:a[0],a[1],a[2]。而每一元素又是一个一维数组,它包含4个元素(即4个列元素),例如,a[0]所代表的一维数组又包含4个元素: a[0][0], a[0][1], a[0][2], a[0][3]。可以认为二维数组是“数组的数组”,即数组a是由3个一维数组所组成的。
二、用二重指针表示数组
因为二维数组是数组的数组,又因为啊a[0]、a[1]、a[2]为三个数组的首地址(等同于&a[0][0]、&a[1][0]、&a[2][0]),所以当我们用二重指针创建数组的时候,实际上是创建了一个指针数组。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(void){
int **p=(int**)malloc(2 * sizeof(int *)); //声明一个二重指针 并且分配2个int类型指针大小的空间
p[0]=(int *)malloc(3*sizeof(int *));//声明指针数组中第一个指针,并且分配3个int类型大小的空间
p[1]=(int *)malloc(3*sizeof(int *));///声明指针数组中第二个指针,并且分配3个int类型大
//批量赋值 并输出
for(int i;i<2;i++){
for(int j=0;j<3;j++){
p[i][j]=(i+1)*(j+1);
cout<<p[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
三、把二维数组赋值给指针数组
上面我们看到二重指针是一个指针数组,那么
int i[2][3]={{1,2,3},{4,5,6}};
int *p[2]={i[0],i[1]};
cout<<p[1][2];
//或者
int i[2][3]={{1,2,3},{4,5,6}};
int (*p)[3]=i; //指针数组
cout<<p[1][2];
//但是不能
int i[2][3]={{1,2,3},{4,5,6}};
int **p=i;