void describe(void *thing);
void *move(void *location, Direction direction);
Die erste Funktion gibt nichts zurück. Die zweite Funktion gibt einen ungültigen Zeiger zurück. Ich hätte diese zweite Funktion als deklariert
void* move(void* location, Direction direction);
Könnte helfen, wenn Sie "nichtig" als "ohne Bedeutung" ansehen. Der Rückgabewert von describe
ist "ohne Bedeutung". Die Rückgabe eines Wertes aus einer solchen Funktion ist unzulässig, da Sie dem Compiler mitgeteilt haben, dass der Rückgabewert ohne Bedeutung ist. Sie können den Rückgabewert dieser Funktion nicht erfassen, da er ohne Bedeutung ist. Sie können keine Variable vom Typ deklarieren, void
da sie ohne Bedeutung ist. Zum Beispiel void nonsense;
ist Unsinn und ist in der Tat illegal. Beachten Sie auch, dass eine Reihe von Leerstellen void void_array[42];
ebenfalls Unsinn ist.
Ein Zeiger auf void ( void*
) ist etwas anderes. Es ist ein Zeiger, kein Array. Lesen Sie void*
als Bedeutung einen Zeiger, der auf etwas "ohne Bedeutung" zeigt. Der Zeiger ist "ohne Bedeutung", was bedeutet, dass es keinen Sinn macht, einen solchen Zeiger zu dereferenzieren. Dies zu versuchen ist in der Tat illegal. Code, der einen ungültigen Zeiger dereferenziert, wird nicht kompiliert.
Also, wenn Sie einen leeren Zeiger nicht dereferenzieren können und keine Reihe von Leerräumen erzeugen können, wie können Sie sie verwenden? Die Antwort ist, dass ein Zeiger auf einen beliebigen Typ in und aus umgewandelt werden kann void*
. Wenn Sie einen Zeiger auf void*
und einen Zeiger auf den ursprünglichen Typ zurücksetzen, erhalten Sie einen Wert, der dem ursprünglichen Zeiger entspricht. Der C-Standard garantiert dieses Verhalten. Der Hauptgrund dafür, dass Sie in C so viele leere Zeiger sehen, ist, dass diese Funktion eine Möglichkeit bietet, das Ausblenden von Informationen und die objektbasierte Programmierung in einer weitgehend nicht objektorientierten Sprache zu implementieren.
Schließlich sehe der Grund , warum Sie oft move
als deklariert void *move(...)
statt , void* move(...)
weil neben dem Namen ein Sternchen setzen , anstatt die Art eine sehr gängige Praxis in C ist Der Grund dafür ist , dass die folgende Erklärung Sie in großen Schwierigkeiten bekommen: int* iptr, jptr;
Das würden Sie machen Ich glaube, Sie deklarieren zwei Zeiger auf einen int
. Du bist nicht. Diese Erklärung macht jptr
eine int
eher als einen Zeiger auf ein int
. Die richtige Deklaration lautet: int *iptr, *jptr;
Sie können so tun, als ob der Stern zum Typ gehört, wenn Sie nur eine Variable pro Deklarationsanweisung deklarieren. Aber denken Sie daran, dass Sie so tun, als ob.
void
während das Codebeispielvoid*
etwas völlig anderes verwendet.