声明
int (* pz)[2];//pz指向一个内含两个int类型值的数值
比较
int *pz[2];//pz是一个内含两个指针元素的数组,每个元素都指向int的指针
由于[]优先级高,先于pz结合,所以pz成为一个内含两个元素的数组。然后表示pz数组内含有两个指针。最后,int表示pz数组中的指针都指向int类型的值。因此,这行代码声明了两个指向int的指针。而前面又圆括号的版本,先于pz结合,因此声明的是一个指向指针(内含两个int类型的值)的指针。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int zippo[4][2]={{2,4},
{6,8},
{1,3},
{5,7}};
int (*pz)[2];
pz=zippo;
printf("zippo= %p, zippo+1= %p\n",zippo,zippo+1);
printf("pz= %p, pz+1= %p\n",pz,pz+1);
printf("zippo[0]= %p, zippo[0]+1= %p\n",zippo[0],zippo[0]+1);
printf("pz[0]= %p, pz[0]+1= %p\n",pz[0],pz[0]+1);
printf("*******************************************************\n");
printf("*zippo= %p,*zippo+1= %p\n",*zippo,*zippo+1);
printf("*pz= %p,*pz= %p\n",*pz,*pz+1);//*zippo==zippo[0];zippo[0]是zippo[0][0]地址,所以*zippo==&zippo[0][0]
printf("*******************************************************\n");
printf("zippo[0][0]= %d\n",zippo[0][0]);
printf("pz[0][0]= %d\n",pz[0][0]);
printf("*zippo[0]= %d\n",*zippo[0]);
printf("*pz[0]= %d\n",*pz[0]);
printf("**zippo= %d\n",**zippo) ;
printf("**pz= %d\n",**pz) ;
printf("zippo[2][0]= %d\n",zippo[2][0]);
printf("pz[2][0]= %d\n",pz[2][0]);
printf("*******************************************************\n");
printf("*(*(zippo+2)+1)= %d\n",*(*(zippo+2)+1) );
printf("*(*(pz+2)+1)= %d\n",*(*(pz+2)+1) );
return 0;
}
猜想验证
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int a[5]={1,2,3,4,50};
int *p;
p=a;
printf("p[2]=%d\n",p[2]);
printf("*(p+2)=%d",*(p+2));
return 0;
}