指针数组与数组指针

如何声明一个指针变量pz指向一个二维数组(如,zippo)?
在编写处理类似zippo这样的二维数组时会用到这样的指针。把指针声明为指向int的类型还不够。因为指向int只能与zippo[0]的类型匹配,说明该指针指向一个int类型的值。但是zippo是它首元素的地址,该元素是一个内含两个int类型值的一维数组。因此,pz必须指向一个内含两个int类型值的数组,而不是指向一个int类型值,其声明如下:

int (* pz)[2];  // pz指向一个内含两个int类型值的数组

以上代码把pz声明为指向一个数组的指针,该数组内含两个int类型值。为什么要在声明中使用圆括号?因为[]的优先级高于*。考虑下面的声明:

int * pax[2];   // pax是一个内含两个指针元素的数组,每个元素都指向int的指针

由于[]优先级高,先与pax结合,所以pax成为一个内含两个元素的数组。然后*表示pax数组内含两个指针。最后,int表示pax数组中的指针都指向int类型的值。因此,这行代码声明了两个指向int的指针。而前面有圆括号的版本,*先与pz结合,因此声明的是一个指向数组(内含两个int类型的值)的指针。

以下演示如何使用指向二维数组的指针:

#include
int main(void)
{
    int zippo[4][2] = {{2,4},{6,8},{1,3},{5,7}};
    int(*pz)[2];
    pz=zippo;
    printf("pz=%p,pz+1=%p\n",pz,pz+1);
    printf("pz[0]=%p,pz[0]+1=%p\n",pz[0],pz[0]+1);
    printf("*pz = %p,*pz + 1 = %p\n",*pz,*pz+1);
    printf("pz[0][0]=%d\n",pz[0][0]);
    printf("*pz[0]= %d\n",*pz[0]);
    printf("*zippo[0]=%d\n",*zippo[0]);
    printf("**pz = %d\n",**pz);
    printf("pz[2][1]=%d\n",pz[2][1]);
    printf("*(*(pz+2)+1) = %d\n",*(*(pz+2)+1));
    return 0;
}

输出结果如下:


系统不同,输出的地址可能不同,但是地址之间的关系相同。如前所述,虽然pz是一个指针,不是数组名,但是也可以使用 pz[2][1]这样的写法。可以用数组表示法或指针表示法来表示一个数组元素,既可以使用数组名,也可以使用指针名:
zippo[m][n] == *(*(zippo + m) + n)
pz[m][n] ==*(*(pz + m) + n)

你可能感兴趣的:(指针数组与数组指针)