    #include <stdio.h>
    
    int x[3][5] =
    {
      {  1,  2,  3,  4,  5 },
      {  6,  7,  8,  9, 10 },
      { 11, 12, 13, 14, 15 }
    };
    
    int (*pArr35)[3][5] = &x;
    // &x is a pointer to an array of 3 arrays of 5 ints.
    
    int (*pArr5a)[5] = x;
    // x decays from an array of arrays of 5 ints to
    // a pointer to an array of 5 ints,
    // x is a pointer to an array of 5 ints.
    
    int (*pArr5b)[5] = &x[0];
    // &x[0] is a pointer to 0th element of x,
    // x[0] is an array of 5 ints,
    // &x[0] is a pointer to an array of 5 ints.
    
    int *pInta = x[0];
    // x[0] is 0th element of x,
    // x[0] is an array of 5 ints,
    // x[0] decays from an array of 5 ints to
    // a pointer to an int.
    
    int *pIntb = *x;
    // x decays from an array of arrays of 5 ints to
    // a pointer to an array of 5 ints,
    // x is a pointer to an array of 5 ints,
    // *x is an array of 5 ints,
    // *x decays from an array of 5 ints to
    // a pointer to an int.
    
    int *pIntc = &x[0][0];
    // x[0][0] is 0th element of x[0],
    // where x[0] is an array of 5 ints,
    // x[0][0] is an int,
    // &x[0][0] is a pointer to an int.
    
    int main(void)
    {
      printf("&x=%p x=%p &x[0]=%p x[0]=%p *x=%p &x[0][0]=%p\n",
             pArr35, pArr5a, pArr5b, pInta, pIntb, pIntc);
    
      return 0;
    }
