Coming back to C after several years, I now think one of the hard things about pointers in C is the C syntax for pointers, not just the idea of pointers in general. Eg, sometimes the type declaration wraps around both sides of the variable name:
int a[2];
int (*ap)[2] = &a; // pointer to array of int
It makes it harder to see what’s what.