Pointer / Referenzen Frage
-
Hallo,
Ich habe eine allgemeine Verständnisfrage zu Pointer und Referenzen.
Also:
Wenn ich z.B. die Variable
char c* = "test";
initalisieren, dann bedeutet der *, welcher in dem Fall Deklarationsoperator ist, dass die Varible c eine Pointervariable ist.
Also in c wird nicht "test" gespeichert, sondern nur die Adresse auf den Start der Zeichenkette. Wann die Zeichenkette zuende ist erkennt der Computer durch die Nullterminierung.
Wenn ich auf diese Variable zugreife, habe ich folgende Möglichkeiten:
putc(c ,stdout) // Das würde jetzt die Adresse an der "test" beginnt ausgeben
putc(&c, stdout) // Das würde jetzt die Adresse angeben, an der die Zeigervariable selbst gespeichert istputc(*c, stdout) //Das würde jetzt den Inhalt der Adresse in c ausgeben. Also würd es "t" ausgeben (weil putc nur einen Char ausgibt).
Soweit richtig denke ich, oder?
Jetzt habe ich hier folgendes:
Ich habe eine Funktion:
int printstring(char *c)
{
printf("String %s", *c);
return 0;
}Ist das korrekt zu sagen, dass die Funktion eine Zeigervariable vom Typ Char annimmt?
Wenn ja, warum funktioniert folgendes nicht (in der Main-Funktion einer anderen Datei):
var *c = "Testtest";
printstring(c);
printstring(*c);Es funktioniert alles nicht.
Wie übergebe ich so eine Zeigervariable, oder besser gesagt: Wie nehme ich sie in der Funktion richtig "entgegen" ?
Vielen Dank.
-
kthesun schrieb:
putc(c ,stdout) // Das würde jetzt die Adresse an der "test" beginnt ausgeben
putc(&c, stdout) // Das würde jetzt die Adresse angeben, an der die Zeigervariable selbst gespeichert istputc(*c, stdout) //Das würde jetzt den Inhalt der Adresse in c ausgeben. Also würd es "t" ausgeben (weil putc nur einen Char ausgibt).
falsch. man: putc(3) schreibt das Charakter, nicht die Zeichenkette, ergo
putc(c ,stdout)
schreibt das Character, welches nach der Konvertierung von (void*) (bzw. ptrdiff_t) zu int entsteht. Siehe man: ascii(7), da ist die Tabelle von möglichen Zeichen. Der Compiler sollte eine Warnung abgeben.putc(&c, stdout)
dito, aber mit der Adresse, wo der Zeiger gespeichert istputc(*c, stdout)
richtigkthesun schrieb:
Jetzt habe ich hier folgendes:
Ich habe eine Funktion:
int printstring(char *c)
{
printf("String %s", *c);
return 0;
}Ist das korrekt zu sagen, dass die Funktion eine Zeigervariable vom Typ Char annimmt?
es ist korrekt das zu sagen. Die Funktion ist dennoch falsch, weil printf einen Zeiger auf eine 0-terminierende Zeichenkette erwartet und mit
*c
übergibst du ein Zeichen, printf interpretiert das Zeichen aber als die Anfangsadresse der Zeichenkette, was in segfault enden kann. Korrekt wäreint printstring(char *c) { printf("String %s", c); return 0; }
oder
int printstring(char *c) { printf("1. Zeichen %c", *c); return 0; }
kthesun schrieb:
Wenn ja, warum funktioniert folgendes nicht (in der Main-Funktion einer anderen Datei):
var *c = "Testtest";
printstring(c);
printstring(*c);siehe oben.
printstring
erwartet einen Zeiger, also musst du einen Zeiger übergeben (also ist der zweite Aufruf einfach syntaktisch falsch).
-
kthesun schrieb:
Wie übergebe ich so eine Zeigervariable, oder besser gesagt: Wie nehme ich sie in der Funktion richtig "entgegen" ?
mit ausnahme des anlegens eines pointers brauchst du das sternchen nur, wenn du den pointer dereferenzieren (also auf das zugreifen willst, worauf er zeigt). wenn du seinen namen ohne * verwendest, ist der pointer selbst gemeint (entspricht der adresse von dem, worauf er zeigt). also: herumreichen von (einfachen) pointern immer ohne sternchen, zugreifen auf die daten selber mit sternchen.