How can I have a solid understanding of C pointers?
How should I direct my way of thinking about pointers in C?
How can I have a solid understanding of C pointers?
How should I direct my way of thinking about pointers in C?
I would suggest you reading (in this order):
It's pretty much everything you need. Pointers are not that complicated once you get the basic idea of them.
In Addition to Pablo's answer above, I strongly suggest you PRACTICE. If you're using pointers every day, you quickly get the hang of them. If all you do is read a book, it can be hard to understand the concepts the author is trying to convey.
I teach programming at a tertiary level, and I have found that the most important concept to understand is the difference between the stack and the heap - once you understand this, the difference between pointers and objects become a lot easier to understand.
Pointers are references to an object rather than the values that are part of the object.
They are like the address of a house rather than the contents of the house.
Just try to remember that changing a pointer doesn't change the value of the object's contents. It only changes where the pointer is pointing to.
Adding onto the above answers, you should also study C code and try to figure out how various programs use pointers. Seeing them in various contexts should help you understand how they are used and why.
The best advice I can give you if you keep messing up on pointer types is to avoid too many levels of pointer dereferencing by using local temporary variable pointers. This helps keep each statement more readable, and also makes it so "incompatible pointer type" error messages are much more clear (since there is only one or two pointers or pointer operations on a given line of code).
Another thing that can help you is to avoid (like the plague) casting pointers (except sometimes to/from void or to integers {but not from integers}). Let the compiler tell you when you are doing something wrong, or might be doing something wrong. When it tells you "no member ... in type ..." or "incompatible pointer type" or something about using an integer as a pointer or a pointer as an integer without a cast it is probably telling the truth no matter how much you think your code is write or understandable.
My brain cannot deal with too many levels of indirection at one time, and these things help me.
If you are talking about keeping up with dynamic memory allocations (via pointer, so some people think that this is "pointer trouble") then you should ask that. If you do I suggest that you give some examples (at least anecdotal examples) of how you mess up while trying to do this.