Beste Antwort
(int *) p ist eine explizite Typumwandlung für den in der Variablen p gespeicherten Wert auf den Typ eines Zeigers, dessen Adresse auf eine Ganzzahl zeigt. Der Wert, den p speichert, ist eine Speicheradresse des 1. Bytes der 4, die zum Speichern der 32-Bit-Ganzzahl (4 Byte) verwendet werden.
Ein Zeiger speichert eine Zahl, die sollte die Adresse zu einem bestimmten Speicherort sein (Heap oder Stack). Der an diesem Speicherort gespeicherte Datentyp kann irgendetwas , und in diesem Ausdruck geben wir an (oder nehmen eher an), dass es sich um eine 4-Byte-Ganzzahl handelt.
Der Wert von p kann typisiert werden, bevor er einem anderen Zeiger zugewiesen wird –
int *c = (int *) p;
Oder es kann dereferenziert werden, den in der von p gespeicherten Adresse gespeicherten Wert als so abzurufen –
int c = *((int *) p);
Oder Wenn p tatsächlich ein Zeiger selbst ist, kann er ohne ihn dereferenziert werden wird explizit typisiert, da wir wissen, dass der darin gespeicherte Wert eine 4-Byte-Ganzzahl ist.
Der Einfachheit halber habe ich die Zeiger nicht auf Null gesetzt. Es ist sehr wichtig, dass Sie prüfen, ob ein Zeiger null ist, da das Dereferenzieren eines Nullzeigers zu einem Absturz führt.
Beispiel für eine Null check –
if (p != null)
printf(“int is ‘\%d’”, *p);
Nehmen wir nun die an Die Adresse ist korrekt und der Zeiger ist nicht null, und der im Speicherort gespeicherte Datentyp ist tatsächlich eine Ganzzahl. Ihre Konsole druckt ihn korrekt aus
Hier ist ein ausführlicher und gut erklärter Artikel, den ich vor einigen Jahren kennengelernt habe, in dem es darum geht, Zeiger in c – im Uhrzeigersinn / Spiralregel
Antwort
Um zu verstehen, was das (int *) dort tut, ist es hilfreich zu verstehen, was malloc (sizeof (int)) tut „s brechen es von rechts nach links auf.
Zuerst haben wir eine Größe von (int). Dies ist ein Wert, der die Anzahl der Bytes darstellt, die erforderlich sind, um eine Ganzzahl im Speicher darzustellen. Dies kann 4 oder eine andere Zahl sein, je nachdem, auf welchem Computer wir programmieren.
Die Funktion malloc () erhält also tatsächlich einen Parameter wie 4, a la malloc (4). Diese Funktion fragt die C-Bibliothek, um irgendwo im Speicher zu verschwinden und 4 Bytes beiseite zu legen (was genau die richtige Größe hat, um eine Ganzzahl zu enthalten).
Jetzt gibt die Malloc-Funktion immer die Adresse dieses Speichers zurück. Rufen Sie diesen Computer auf Der Speicher ist seriell angeordnet und jede Adresse im Speicher ist eindeutig. Jetzt ist malloc () keine sehr intelligente Funktion – Sie sagen ihm, wie viel Speicher Sie möchten, und es heißt „hier ist es“. Es weiß nicht, was Sie möchten in diesen Speicher einfügen – es weiß nur, wie viel Speicher Sie angefordert haben.
Da malloc () nicht weiß, was Sie in diesen Speicher einfügen möchten, wird ein Typ namens (void) zurückgegeben *), dh eine beliebige Speicheradresse, die auch als Zeiger bezeichnet wird. Auf den meisten modernen Computern ist eine Adresse ein 64-Bit-Wert, der in 8 Byte Speicher dargestellt werden kann – Computer unterscheiden sich jedoch r und verschiedene Computer können unterschiedliche Größen zurückgeben. Malloc () kann also 8 Datenbytes im Format (void *) zurückgeben.
Zuletzt müssen wir in den Speicher gelangen, den malloc () uns gegeben hat, damit wir ihn als enthaltend behandeln können ganze Zahl. Wie machen wir das? malloc () gab uns nur einen Hinweis auf eine Erinnerung irgendwo im Weltraum. Wir tun dies, indem wir dem Compiler mitteilen, dass die Speicheradresse, die wir von malloc () erhalten haben, wirklich die Adresse einer Ganzzahl ist. Daher Ihr (int *).
Nachdem Sie das alles durchlaufen haben, versteht der Compiler vollständig, was Sie wollten, weil Sie sich die Mühe gemacht haben, jeden Schritt zu beschreiben: Sie möchten ein Acht-Byte Adresse, die auf eine 4-Byte-Position im Speicher verweist, die wiederum eine Ganzzahl enthält.
Und genau das bedeutet dieser gesamte Ausdruck!