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

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

int s10是一个数组

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

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

10表示这个数组的大小,如果是二维的就用\[\]\[\]来表示

指针数组本质是存放指针的数组

int* p\[\];int p\[\];

int*表示数组中存放的数据类型和int一样

在数组中数组名有两层含义

一是数组名称

二是数组内第一个数据的地址,这是一个地址常量

int s10

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

&s0指对这个数据取地址,用int*表示

二维数组

int s1015

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

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

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

关于用指针模拟数组

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

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

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

&p0也是等于int*q

对于二维数组

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

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

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

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

}

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

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

int(q)56=(int(56)p

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

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

p0是这一行中的第一个数据的地址

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

int (q)56=(int ( )56)p

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

这里的p是储存行指针的数组指针,访问时qij

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

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