malloc und pointer

Name1235

Banned
Registriert
Okt. 2015
Beiträge
51
Hallo, ich kann ja folgendes schreiben:

Code:
int* ptr;

ptr=malloc(...);

ptr[0]=3;

Meine Frage dazu lautet nun, warum geht das?
Wenn man der Adresse eines "normalen" Pointer einen Wert zuweist, muss man ja schreiben:

Code:
int a;
int* ptr;

ptr=&a;
*ptr=5

Warum kann ich oben das * weglassen?
 
Weil da ein Arrayindex steht.
Ist das ne Hausaufgabe?
 
Nein es ist keine Hausaufgabe, da kann ich dich beruhigen.
Aus dem Alter bin ich raus xD.

Wie meinst du das, weil da ein Arrayindex steht.
Wie kann man sich das anschaulich vorstellen.
Normal weist du ja mit z.B.
Code:
ptr=329238
der Adresse des Pointers selbst die neue Adresse 329238 zu.

Mit
Code:
*ptr=2323:
dagegen weist du der Variable auf die der Pointer zeigt einen Wert zu.

Warum ist das anders, wenn man aus dem Pointer ein Array macht?
 
Der Index ist nur eine hübschere Schreibweise für

Code:
*(ptr + index) = value;
 
Hm, so ganz verstehe ich das noch nicht.
Ich habe gelert, dass man immer wenn man einer Pointervariablen einen Wert zuschreiben will ein * setzen muss.
Warum das oben dann plötzlich ohne geht, ist mir das nicht richtig klar.
Ich weiß jetzt, dass es an dem Array liegen muss. Denn ich habe aus dem Pointer ja ein Pointerarray gemacht, oder?
 
Arrays in C sind immer Pointer. Du kannst die Array-Syntax an jedem Pointer benutzen (und natürlich auch Access Violations damit erzeugen). Umgekehrt geht es genauso. Der Index entspricht schließlich nur einem Offset der Adresse.
Bei Verwendung der Array-Syntax ist die Dereferenzierung (*) implizit dabei.

Folgende Statements sind also vom Ergebnis identisch:

Code:
*(ptr + index) = 42;
ptr[index] = 42;
 
Zuletzt bearbeitet:
Achso,
darüber habe ich erst neulich etwas gelesen.
Dann macht alles Sinn, vielen Dank an alle.
 
Nunja, malloc() gibt dir ja einen Pointer zurück , der zeigt auf einen Speicherbereich wo dein Array losgeht. "int* ptr" erstellt eine Variable die als pointer dient. Deswegen kannst du es direkt zuweisen - ptr hat dann die Adresse wo das Malloc() was getan hat.

Die eckigen Klammern sind nur eine Kurzschreibweise für: PointerAdresse + Offset
Also ptr+1 würde dir Array Index [1] liefern, während ptr auf index [0] zeigt.
 
Korrekterweise müsste es
Code:
*(ptr + sizeof(int)*index) = 42
sein.
kinglouy schrieb:
Folgende Statements sind also vom Ergebnis identisch:

Code:
*(ptr + index) = 42;
ptr[index] = 42;
 
Unnötig, wenn es sich um einen Int Ptr handelt. Die Multiplikation ist ebenfalls implizit.
 
Zurück
Oben