BOOL non è un tipo C++. Probabilmente è typedef o definito da qualche parte e, in questi casi, sarebbe lo stesso di int. Windows, per esempio, ha questo in Windef.h:
typedef int BOOL;
così la tua domanda si riduce a, perché si può typecast int * di annullare, ma non galleggiare a void *?
int a void * è ok ma in genere non è consigliato (e alcuni compilatori ne metteranno in guardia) perché sono intrinsecamente uguali nella rappresentazione. Un puntatore è fondamentalmente un numero intero che punta a un indirizzo in memoria.
float to void * non è ok perché l'interpretazione del valore float e dei bit effettivi che la rappresentano sono differenti. Ad esempio, se si fa:
float x = 1.0;
ciò che fa è imposta la memoria a 32 bit a 00 00 80 3f (la rappresentazione effettiva del valore float 1,0 in IEEE singola precisione). Quando lanci un galleggiante su un vuoto *, l'interpretazione è ambigua. Intendi il puntatore che punta alla posizione 1 in memoria? o intendi il puntatore che punta alla posizione 3f800000 (assumendo little endian) in memoria?
Ovviamente, se sei sicuro di quale dei due casi desideri, c'è sempre un modo per aggirare il problema. Ad esempio:
void* u = (void*)((int)x); // first case
void* u = (void*)(((unsigned short*)(&x))[0] | (((unsigned int)((unsigned short*)(&x))[1]) << 16)); // second case
I riferimenti Objective-C sono di tipo 'id'. Vedi http://stackoverflow.com/questions/1304176/objective-c-difference-between-id-and-void – Potatoswatter