二维数组的指针,指针构成的数组

在学习C Primer Plus中,发现:

第十章使用的大部分是二维数组的指针这种形式,即

int (* pz) [2];

第十一章出现了指针的数组形式,即

const char *mytal[LIM];

于是我有点懵逼了,到底这俩货是什么意思,可以互相代替吗?下面自己举例子试试看。

比如我想表示一个二维数组,{{1,2,3},{4,5,6},{7,8,9},{10,11,12}},三行四列,用两种方式试试看。

/* 二维数组的指针 与 指针的数组 */
#include <stdio.h>

int main(void)
{
    int i,j;
    int zippo[4][3] = {
                        {1,2,3},
                        {4,5,6},
                        {7,8,9},
                        {10,11,12}
                      };
    int (*pa)[3];    //二维数组的指针
    int *pb[4];      //指针的数组(4个指针构成的一个数组,每个指针指向一个int型)

    pa = zippo;

//  pb = zippo;     //表达式必须是可修改的左值?说明pb是常量,pb是一个数组名,代表了首元素pb[0](一个指针变量)地址:&(pb[0])
                    //这是一个常量,说明了在C语言中,声明一个变量的同时也给他分配了固定的地址!

    pb[0] = zippo[0];//pb[0]是一个指针变量,存放的地址是地址&zippo[0][0]
    pb[1] = zippo[1];//pb[1]是一个指针变量,存放的地址是地址&zippo[1][0]
    pb[2] = zippo[2];//pb[2]是一个指针变量,存放的地址是地址&zippo[2][0]
    pb[3] = zippo[3];//pb[3]是一个指针变量,存放的地址是地址&zippo[3][0]

    printf("pa:
");
    for(i=0; i<4; i++)
    {    
        for(j=0; j<3; j++)
            printf("%-3d",pa[i][j]);
        printf("
");
    }

    printf("

pb:
");
    for(i=0; i<4; i++)
    {
        for(j=0; j<3; j++)
            printf("%-3d",*(pb[i]+j));
        printf("
");
    }
}

所以,两种使用指针的方式去表示二维数组:

1.使用二维数组的指针,需要知道每个元素数组中的元素个数,当然元素数组的个数不用说明,留给指针自己控制。例如:

int (*pa)[3];
pa = zippo;

2.使用指针数组,需要知道元素数组(即指针)的个数,当然每个元素数组中的元素的个数不需要说明,留给每个指针自己控制。而且赋值时需要分别对每个指针元素赋值。例如:

int *pb[4];      //指针的数组(4个指针构成的一个数组,每个指针指向一个int型)
 pb[0] = zippo[0];//pb[0]是一个指针变量,存放的地址是地址&zippo[0][0]
 pb[1] = zippo[1];//pb[1]是一个指针变量,存放的地址是地址&zippo[1][0]
 pb[2] = zippo[2];//pb[2]是一个指针变量,存放的地址是地址&zippo[2][0]
 pb[3] = zippo[3];//pb[3]是一个指针变量,存放的地址是地址&zippo[3][0]



原文地址:https://www.cnblogs.com/TomLily/p/5851911.html