数组指针实际上是指向数组的指针
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类型的数据,所以对其取地址是intp
关于用指针模拟数组
用指针模拟数组其本质就是用动态分配,分配一片连续的空间用来,模拟数组进行操作
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数据了,在这里可以用intq来表示