一:指针数组
首先,我们可以先类比一下,整型数组是用来存放整型的数组,字符数组是用来存放字符的数组,那指针数组就应该是存放指针的数组。
指针数组的每个元素都是地址,又可以指向一块区域
(1)指针数组模拟实现二维数组
#include<stdio.h>
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[]={2,3,4,5,6};
int arr3[]={3,4,5,6,7};
int *arr[3]={arr1,arr2,arr3};
int i=0; int j=0;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
代码运行的结果
实质为:
通过arr[i]来找到要访问的数组,然后用arr[i][j]就是用来访问arr i 的 j 下表的元素,
上述代码模拟出二维数组的效果,实际上并不是二维数组,因为3个数组并不是连续的,而二维数组则是连续的。
二:数组指针变量
同样类比,整型指针变量,字符指针变量,数组指针变量的实质是变量
整型指针变量: int * p 存放的是整型变量的地址,能够指向整型数据的指针。
浮点型指针变量:float* p 存放浮点型变量的地址,能够指向浮点型数据的指针。
首先来个易混淆判断: 下面那个是数组指针变量呢
int *p1[10];
int (*p2)[10];
当然是 int (*p2)[10] 啦;
解释:p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10个整型的数组,综上,p是一个指针,指向一个数组,故其就是数组指针。(因为[ ] 的优先级高于* 所以才用( )将* p 放在一起)
(1)数组指针的初始化
数组指针变量是用来存放数组的地址,那么只需要我们获得数组的地址就可以了。
int arr[10];
int (*p)[10]=&arr;
#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,0};
int (*p)=&arr;
int i=0;
for(i=0;i<10;i++)
{
printf("%d ",p[i]);
)
printf("\n");
for(i=0;i<10;i++)
{
printf("%d",arr[i]);
}
return 0;
}
通过代码运行的结果可以看出&arr和p的类型是完全一致的。
深度解析: