Ich versteh' das nicht - Zeiger-Arrays
-
Hallo,
ich verstehe einfach nicht warum das ein Zeiger ist bzw. sein muss:static char *err[] = { "Cannot Open File\n", "Read Error\n", "Write Error\n", "Media Failure\n" };
ich hoffe das kann mir jemand von euch genauer erklähren
danke für eure hilfe!!
-
In C/C++ sind Stringliterale konstante char-Zeiger, drum kannst du einem Pointer auf char auch ein Stringliteral zuweisen.
Beispiel:
char* p = "Hallo";
printf("%s\n",p); // "Hallo"
printf("%s\n",++p); // "allo"
*p = 'A'; // Geht nicht, da der Pointer ja auf was konstantes zeigtWenn du jetzt Strings in einem Array ablegen willst, dann brauchst du eben ein Array von char-Pointern.
-
schon mal danke für die gute Erklährung :)!
Ich verstehe aber nicht genau, warum ich jetzt kein *p sondern nur p brauche. *p beduetet doch den wert der Adresse ausgeben!?
-
Absoluter Neuling! schrieb:
schon mal danke für die gute Erklährung :)!
Ich verstehe aber nicht genau, warum ich jetzt kein *p sondern nur p brauche. *p beduetet doch den wert der Adresse ausgeben!?
Öhm, ich weiß jetzt nicht genau, WAS du nicht verstehst.
Am besten nochmal ein kleines Beispiel:Das hier:
char *p = "Hallo" // p beinhaltet jetzt die Adresse vom 'H'
... kannst du dir auch in etwa so vorstellen:
const char string[] = {'H', 'a', 'l', 'l', 'o','\0' }; const char* p = string; printf("p=%s\n", p); printf("p++\n"); p++; // p zeigt jetzt auf 'a' printf("string=%s\n", string); printf("p=%s\n", p); *p = 'b'; // geht wieder nicht, da ja string const ist und NICHT verändert werden darf
Das Speicherlayout sieht hier übrigens so aus (Pseudeodarstellung):
p [ 0x10000000 ] <-- Inhalt von p
0xFFAACC00 <-- Adresse des Pointers pDer Stringliteral aus dem 1. Beispiel:
'H' 0x10000000
'a' 0x10000001
'l' 0x10000002
'l' ...
'o'*p beduetet doch den wert der Adresse ausgeben!?
Exakt. *p heißt: Nimm den Wert, der an der Adresse steht, der im Pointer gespeichert ist. Bei uns würde das dann heißen: Nimm den Wert, der an der Adresse 0x10000000 steht (also 'H')
-
Das hat nix mit Stringliteralen hier zu tun, zumindest nicht mit den Problemen C <-> C++. Ich denke das wollte der OP nicht wissen.
Ihm ging es eher mehr um die Frage warum man ein Feld von Zeigern verwendet.
Das "static char *err[]" heisst ja nichts anderes als das "err" ein Feld von Zeigern auf chars ist. Das heisst in dem Feld werden die Anfangsadressen der "einzelnen" Strings gespeichert. Um die Speicherverwaltung kümmert sich hier der Compiler.
Ausgeben kannst du sie dann zb. so printf("%s", err[0]); ausgeben. Hier wird der erste String ausgegeben. Präziser übergibst du printf die Adresse die an der Stelle 0 im Feld err steht.
bye
tt