词组解析:
数组指针:我们可以这样记忆与理解,看词组最后两个字是指针,那么含义就是指向数组的指针。
指针数组:看词组的最后两个词是数组,那么含义是数组里面元素是指针的数组。
我们看代码可以更容易理解。
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)整型