申明的区分:
指针数组的申明:
int *np[COL];
从操作符的优先级来看,np先与[ ]结合再与*结合,不难看出np是个数组名且其成员是一个指向int数据的指针。
数组指针的申明:
int (*p)[COL];
从操作符的优先级来看,先与*结合再与()结合最后与[ ]结合,易知p是个指针且其指向一个具有COL个成员的数组。因为p是指向数组的,因此p++的步长
是数组的长度。
具体区别及应用请看一下代码:
#include <stdio.h>
#include <stdlib.h>
#define COL 5
#define ROW 4
int main()
{
int matrix[ROW][COL];
int (*p)[COL]; //数组指针
int *np[COL]; //指针数组
int i,j;
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
matrix[i][j]=i*10+j;
}
p=matrix;//这是允许的!因为p、matrix都是指向数组的指针。
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
printf("%02d ",*(*(p+i)+j));//*(*(p+i)+j) <=> matrix[i][j]
printf("\n");
}
printf("\n");
for(j=0;j<COL;j++)
np[j]=matrix[0]+j; //np数组的每个成员都是指针。将matrix[0][j]的地址赋给np[j],即np存储的是第一行所有元素的地址
for(j=0;j<COL;j++)
printf("%02d ",*np[j]);//对第一行元素进行访问
printf("\n");
return 0;
}
运行结果如下:
: