I stumbled on this exceedingly helpful piece of advice for understanding type definitions in C in a comment on StackOverflow:

“Start at the name, read right when you can, left when you must”:

The commenter goes ahead to explain the example char (*a[2])[14]:

  1. start at a,
  2. move right: “array of two”,
  3. move left: “pointer to”,
  4. bracket complete so read right: “array of fourteen”,
  5. read left: “char”

Put it together and we have “a is array of two pointers to arrays of fourteen chars”