核心要点:数组指针是指向数组的指针,指针数组是存放指针的数组。指针数组是数组,数组指针是指针。
数组指针: (*a)[ ] : ()的优先级比[ ]要高,所以(*a)[ ] 首先是一个指针,然后再指向一个数组,数组指针又称为行指针
指针数组: *a[ ] : [ ]的优先级比*要高,所以*a[ ] 首先是一个数组,然后其存放的数据类型才是指针
指针数组和数组指针用于动态内存分配
#include <stdio.h>
#define N 5
#define M 4
using namespace std;
int main(int argc,char* argv[])
{
int m=4;
//已知第二维,第一维未知
int (*a)[N]=new int[m][N]; //数组指针
//已知第一维,第二维未知
int i,n=5;
int *b[M]; //指针数组
for(i=0;i<M;i++)
{
b[i]=new int[n]; //为每一行分配内存
}
return 0;
}
理解二维数组的内存的动态分配,就需要理解二维数组的存储方式,
#include <stdio.h>
#define M 3
#define N 4
using namespace std;
int main(int argc,char* argv[])
{
int arr[M][N];
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
}
}
return 0;
}
输出如下:
&arr[0][0]=0061FEE8
&arr[0][1]=0061FEEC
&arr[0][2]=0061FEF0
&arr[0][3]=0061FEF4
&arr[1][0]=0061FEF8
&arr[1][1]=0061FEFC
&arr[1][2]=0061FF00
&arr[1][3]=0061FF04
&arr[2][0]=0061FF08
&arr[2][1]=0061FF0C
&arr[2][2]=0061FF10
&arr[2][3]=0061FF14
可知二维数组也是连续分配内存的,而数组指针所指向的空间也是连续的,接下来只需要将该指针指向此二维数组的首地址就可以了。那么在利用数组指针为第一维未知,第二维已知的数组动态分配内存时,便可以进行一次性分配内存了。而指针数组是多个指针,每一个指针需要指向二维数组的每一行的首地址,所以需要多次动态分配。
事实上,已知二维数组的第一维,未知第二维也是可以进行一次性动态内存分配的。