1. 指向多维数组的指针:(图片及代码摘自C Primer Plus 第6版-10.7.1)
  • int (*pz)[2];
    (1)*pz,则pz是一个指针
    (2)[2],则这个指针指向包含两个元素的数组
  • int * pax[2];
    (1)[]优先级高于*,则pax是一个包含两个元素的数组
    (2)*,则这个数组中的元素是指针
书中的示例代码及其运行结果:
#include <stdio.h>

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("**pz = %d\n", **pz);
    printf("pz[2][1] = %d\n", pz[2][1]);
    printf("*(*(pz+2) + 1) = %d\n", *(*(pz + 2) + 1));
    
    getchar();
    return 0;
}

2. 二维数组动态申请内存:(代码摘自C Primer Plus 第6版-12.4.3)
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int n = 5;
    int m = 6;
    int arr[n][m]; // n*m 的变长数组(VLA)
    int (*p1)[6]; // C99之前的写法
    int (*p2)[m]; // 要求支持变长数组
    p1 = (int (*)[6]) malloc(n * 6 * sizeof(int)); // n*6 数组
    p2 = (int (*)[m]) malloc(n * m * sizeof(int)); // n*m 数组(要求支持变长数组)
    
    arr[1][2] = p1[1][2] = p2[1][2] = 12;
    
    printf("arr[1][2]=%d, p1[1][2]=%d, p2[1][2]=%d\n", arr[1][2], p1[1][2], p2[1][2]);
    
    getchar();
    return 0;
}