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]
:
- start at a,
- move right: “array of two”,
- move left: “pointer to”,
- bracket complete so read right: “array of fourteen”,
- read left: “char”
Put it together and we have “a is array of two pointers to arrays of fourteen chars”