例如:


    int main(){
        int B[2][3] = {{2,3,6}
                       {4,5,8}};
        int (*p)[3];
        p = B;
    }
								

  此处将二维数组B看做两个一维数组的集合,对于每个一维数组都有3个元素,所以用(*p)[3]来指向整个一维数组。若此时对其进行输出:


    printf("%d", B);           // 指向整个二维数组的地址即第一个一维数组地址,输出B[0][0]的地址
    printf("%d", &B[0]);       // 指向第一个一维数组的地址,输出B[0][0]的地址
    printf("%d", *B);          // 指向第一个一维数组的地址,输出B[0][0]的地址
    printf("%d", B[0]);        // 指向第一个一维数组的地址,输出B[0][0]的地址
    printf("%d", &B[0][0]);    // 指向第一个一维数组的第一个元素的地址,输出B[0][0]的地址
    printf("%d", B + 1);       // 指向第二个一维数组的地址,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
    printf("%d", &B[1]);       // 指向第二个一维数组的地址,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
    printf("%d", *(B + 1));    // 指向第二个一维数组,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
    printf("%d", B[1]);        // 指向第二个一维数组,即第二个一维数组的第一个元素的地址,输出B[1][0]的地址
    printf("%d", &B[1][0]);    // 指向第二个一维数组的第一个元素的地址,输出B[1][0]的地址
    printf("%d", *(B + 1) + 2);// 指向第二个一维数组的第三个元素的地址,输出B[1][2]的地址
    printf("%d", B[1] + 2);    // 指向第二个一维数组的第三个元素的地址,输出B[1][2]的地址
    printf("%d", &B[1] + 2);   // 指向第二个一维数组的第三个元素的地址,输出B[1][2]的地址
								

  对上述情况进行解引用,可获得对应地址的值。

  如何解读指针和二维数组,例如:*(*B+1),首先解读*B,为一个指向二维数组的指针,即第一个一维数组,对其+1,则为第一个一维数组的第二个元素,再对其进行解引用,即可输出第一个一维数组的第二个元素的值,即B[0][1]的值。

  总结:


    B[i][j] = *(B[i] + j)
            = *((*B + i) + j)