Вы должны строго различать, что вы хотите: приведение или разыменование?
int x = 5;
int* p = &x; // pointer points to a location.
int a = *p; // dereference, a == 5
int b = (int)p; //cast, b == ...some big number, which is the memory location where x is stored.
Вы по-прежнему можете назначать int непосредственно указателю, но не разыменовывайте его, если вы не действительно знаете, что делаете.
int* p = (int*) 5;
int a = *p; // crash/segfault, you are not authorized to read that mem location.
int b = (int)p; // now b==5
Вы можете обойтись без явных приведений (int)
, (int*)
, но, скорее всего, получите предупреждения компилятора.