数组指针与指针数组的关系以及数组相关内容

数组指针实际上是指向数组的指针

int s[10]是一个数组

想用一个指针来储存这个数组,而这个指针就是数组指针

定义方式为int (p)[10]
这里依次的含义是
int 表示这个这个数组储存的数据类型,根据数据类型的不同比如int
类型,double类型flont类型等等都可以作为前缀
p这里表示声明一个指针,这里要用括号是因为[10]的优先级比 高,如果没有这个括号就变成了指针数组

10\]表示这个数组的大小,如果是二维的就用\[\]\[\]来表示 指针数组本质是存放指针的数组 int\* p\[\];int p\[\]; int\*表示数组中存放的数据类型和int一样 在数组中数组名有两层含义 一是数组名称 二是数组内第一个数据的地址,这是一个地址常量 int s\[10

&s指对s这个数组取地址,应该用数组指针来表示int(p)[10]
s指这个数组内第一个数据的地址,用int
p

&s[0]指对这个数据取地址,用int*表示

二维数组

int s[10][15]

&s指对s这个数组取地址,应该用数组指针来表示int(p)[10][15]
与一维数组的区别在于数组形式不同
s指这个数组内第一个一维数组的地址,其本质还是数组,用int(
p)[10]

因为在二维数组中实际上第一个数据是是s[0][]的所有数据这是一个数组指针

&s[0],因为是s[0]实际上是一个一维数组,所以指对这个数据取地址,用int(p)[10]表示
&s[0][0]这是一个int类型的数据,所以对其取地址是int
p

关于用指针模拟数组

用指针模拟数组其本质就是用动态分配,分配一片连续的空间用来,模拟数组进行操作

intp=(int )malloc(sizeof(int)5)
这里就可以定义为数组大小为5,数据类型为int的数组
这里可以直接用p[5]来表示
但在这里与上面不同的是这里不能用用数组指针来表示对p取地址
因为虽说我们可以把其看为数组,但其本质还是一个指针所以在这里如果想用数组指针来表示,我们要进行强制类型转化
如int (
q)[5]=(int ()[5])p
不能直接用int (
q)[5]=&p

因为p本质是一个int类型的变量,对其取地址得到的只是int**类型的数值
这里的p还是可以等于int
q

&p[0]也是等于int*q

对于二维数组

用指针模拟需要先申请一片空间来储存先对应的一维数组的地址

intp=(int )malloc(sizeof(int*)* 5)

我们可以把这里也看做是一个数组,是一个指针数组

因为在这个空间中储存的数据是int类型的地址而不是具体的数据
在这个申请中我们确定了有多少行,但每行具体有多少个数据还没申请,接下来申请的就是每行有多少数据
for(int i=0;i<5;i++){
p[i]=(int)malloc(sizeof(int)
6);

}

这里要申请的是每行具体有多少数据

在这里也是同理不能直接用&来获取p的地址,然后用数组指针来表示,也要先强制类型转换

int(q)[5][6]=(int( )[5][6])p

原因和上面一样p本质是一个int类型的二级指针,对其取地址得到的是三级指针
p在这里可以是一个指向数组指针的地址,他是一个二级指针
所以int
q=p

p虽然在数据上是第一个行数据数组的地址,但其并不等于p[0]

p[0]是这一行中的第一个数据的地址

这里同样可以通过强制类型转换将其转换为数组指针

int (q)[5][6]=(int ( )[5][6])p

这里的p是指向整个数组的数组指针,访问时需要(q)[i][j]
int (
q)[5]=(int (*)[5])p

这里的p是储存行指针的数组指针,访问时q[i][j]

p=p[0]
因为p在这里表示这个数组储存的第一个数据,而这个数据是int
类型的

&p[0],p[0]表示对这个指针数组的第一个行指针的地址,是一个int类型的数据,对其取地址是一个二级指针int**
&p[0][0],p[0][0]这就是一个int数据了,在这里可以用int
q来表示