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

数组指针实际上是指向数组的指针
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(int5)
我们可以把这里也看做是一个数组,是一个指针数组
因为在这个空间中储存的数据是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在这里表示这个指针数组的地址,对p进行
处理得到的就是这个数组指针能储存的第一个值
&p[0],p[0]表示对这个指针数组的第一个行指针的地址,是一个int类型的地址,对其取地址是一个二级指针int**
&p[0][0],p[0][0]这就是一个int数据了,在这里可以用int
q来表示

posted @ 2025-12-15 21:59  爱偷懒的我  阅读(4)  评论(1)    收藏  举报