It depends on what they are pointing to …(?) I had just switched companies. I was about a year and a half out of school with pretty solid C skills. A senior programmer at the new company who was new to C asked me to review a C module he was implementing. All of the code looked pretty solid. The module used a fairly large struct for tracking its data. Every method in the module accepted a pointer to the struct type or else used a global pointer (too long ago). After reviewing the code, I asked him “Where is the memory allocated to actually hold the struct data?”. Huh? We added a global variable declaration of his struct type and initialized the global pointer with its address and everything worked fine. My tenets when dealing with pointers: 1. When declaring the pointer, the * is part of the type. int* justAPlainOldVariableOfTypeIntPointer; int** justAPlainOldVariableOfTypeIntPointerPointer; 2. A pointer is a leash 3. A pointer is NOT the dog!(or cat but who leashes their cat, it is undignified) 4. When writing or reading code with the dereference operator *, say “dereference “ out loud. 4a. Understand the difference between * as declaration, * as dereference unary operator and * as multiple binary operator or do not try to use them! 5. Same for addressOf & operator. (as well as assignment operator, comparison operator, etc) 6. The compiler enforces type safety. Let it do its job! Unless you are dealing directly with hardware or doing low level memory tricks, you should not need to recast something.