我们看代码可以更容易理解。
int a[3][4];int(*p)[4];//数组指针,p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为4个整型的数组。所以p是一个指针,指向一个数组叫指针数组。//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。一个数组,叫数组指int *q[3];//指针数组p = a;for (int i = 0; i < 3; ++i){q[i] = a[i];数组名一定不能放在左值}int a[3][4];//a(int(*)[4])a[i](int *) a[i][j](int)int b[10];//b(int *) b[i](int)从二维数组来理解,首先先介绍几个概念。
数组名代表数组首元素的首地址。数组的下标为什么从0开始?因为下标表示的是当前元素距首地址的偏移量。用树的方法来理解二维数组。 a[0] a[1] a[2] 从代码中可以看到定义一个int(*p)[4];//数组指针,那么就可以指向p = a;p+1->a[1]; int *q[3];//指针数组,可以看到q是数组名,数组名是绝对不可以放到左值,因为它的地址空间已经占用,不能再赋值。指针数组初始化方式可以是
for (int i = 0; i < 3; ++i){q[i] = a[i];数组名一定不能放在左值}可以单个赋地址值。
int *arr[10];int *a[4];int **arr[10];以上这些都是指针数组,为什么 呢?首先 拿第一个为例,arr先与[10]结合成为一个数组,然后这个数组里存着10个元素,每个元素的类型为int*;第二个也一样。第三个的意思是arr与[10]结合成为一个数组,数组的元素类型为int**。总的来说就是存放指针的数组叫指针数组。它怎么用呢?如下:
int *arr[10] = {"123","world"};这里面因为存放的都是一个int型的指针,所以每个指针都可以指向一个字符串。
我们来加强深化一下int a[3][4];二维数组
a 的类型是(int(*)[4])数组指针
a[i]的类型是(int *)指针是每一行的首地址
a[i][j]的类型是(int)整型
int b[10];一维数组
b的类型是(int *)指针(数组首元素的首地址)
b[i]的类型是(int)整型