* Performance. Pointer access is an order of magnitude more expensive.
* Errors. Pointer access can fail (especially for NULL pointer).
It checks array access bounds, but segfaults for null pointers. Seems an odd choice, and there are multiple discussions of people saying the same.
Yes, I know, adding a huge fixed offset to the pointer can push it past the null protected pages.
It's super common to define a struct on the stack and then pass a pointer to an init function to initialize the value that is on the stack.
Sometimes pointers are faster because you don't have to copy the entire struct.
What largely determines the performance of values vs. pointers is whether that location in RAM is cached, and whether you need to allocate memory on the heap.
The result makes it much easier to refactor code. Ever try replacing a value with a pointer in C? Arrghh.