指针数组和数组指针的本质
指针数组
本质上就是一个数组
数组的内容是指针
声明方式
int *a,*b,*c;
int *p[10] = {a,b,c};
原因:在c中[]的优先级比*要高,p优先与[]结合,形成一个数组,int * 则是修饰这个数组元素的类型
数组指针
本质上就是一个指针
这个指针指向数组(好像也叫行指针)
声明方式
int a[6] = {0};
int (*p)[6] = &a;
原因:()将p和 * 结合到了一起,表明p是一个指针
int []说明了p这个指针指向的是一个int数组
例子代码
用数组指针管理二维数组空间
这里的p指向a[0]这个一维数组
p = a 等价于 p = &a[0]
p[0] == *p 描述的是一个一维数组
p[0][0] == **p 描述的是一个元素
#include <stdio.h>
int main()
{
int a[6][10];
for(int i = 0;i < 6;i++)
for(int j = 0;j < 10;j++)
a[i][j] = i * 6 + j;
int (*p)[10] = a;//数组指针
//相当于 p = &a[0];
for(int i = 0;i < 6;i++)
for(int j = 0;j < 6;j++)
{
printf("%-3d",p[i][j]);
if(j == 5)
printf("\n");
}
return 0;
}
指针数组
#include <stdio.h>
int main()
{
int a[6][10];
for(int i = 0;i < 6;i++)
for(int j = 0;j < 10;j++)
a[i][j] = i * 6 + j;
int *p[6];
for(int i = 0;i < 6;i++)
p[i] = a[i];
for(int i = 0;i < 6;i++)
for(int j = 0;j < 6;j++)
{
printf("%-3d",p[i][j]);
if(j == 5)
printf("\n");
}
return 0;
}