Frage zu Zeiger in C
-
Hunter S Thompson schrieb:
Kannst Du mir das näher erläutern?
Wie wird das damit überprüft?
gets ( textpuffer ) beschreibt das Array Textpuffer mit dem eingegebenen Text und würde auch einzeln gehen. (?)also wenns erfolgreich ist liefert dir der rückgabe wert von gets textpuffer zurück wenn nicht wird NULL zurückgegeben worauf in der nachfolgende if abfrage geprüft wird. ich weiss es nicht genau, aber ich glaube textpuffer ist überflüssig und man könnte dann auch adr ausgeben ... weissnicht nicht getestet aber ne grobe vermutung
-
ist der zeiger (sternchen) nich t in der if abfrage quatsch?
if ( *adr != NULL )
-
Ja, glaub der is blödsinn.
Hatte das geändert. war vorherif ( adr != Null )
dachte *adr ist der Inhalt des ersten Zeichens des Textes - wenn der ein Enter enthält war es ne falsche eingabe.
Jetzt seh ich aber garnicht mehr durch.
-
adr kann NULL sein, *add kann nicht NULL sein, weil typeof(*add) char ist.
-
hab das aber so getestet und es ging.
Also mit if ( *adr != NULL ) liefert das Programm bei keiner Eingabe nur Enter Falscche Eingabe zurück.
Bei if ( adr != NULL ) Erfolgreiche Eingabe.
-
NULL ist (oft) 0, und 0 lässt sich in char konvertieren. Die Aussage Deines Vergleichs ist eigentlich:
if (*adr != '\0')
-
LordJaxom schrieb:
NULL ist (oft) 0, und 0 lässt sich in char konvertieren.
noch öfter aber: *#define NULL ((void )0)
-
Wer bietet mehr ?
In meiner stdlib.h steht das:#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
-
Hunter S Thompson schrieb:
hab das aber so getestet und es ging.
Also mit if ( *adr != NULL ) liefert das Programm bei keiner Eingabe nur Enter Falscche Eingabe zurück.
Bei if ( adr != NULL ) Erfolgreiche Eingabe.siehe LordJaxom Antwort. So wie du es geschrieben hast, hast du nicht überprüft, ob adr ein gültiger Pointer ist, sondern ob das erste Zeichen ein gültiger Pointer ist (so viel zur Semantik).
Da NULL in den meisten Fällen ein (void
0 ist und damit mit 0 äquivalent, hast du tatsächlich überprüft, dass die Eingabe mind. die Länge 1 hat. Wenn angenommen gets fehlgeschlagen hätte, dann wäre dein Programm abgestürzt.
-
Big Brother schrieb:
Wer bietet mehr ?
In meiner stdlib.h steht das:#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
Das versteh ich nun leider überhaupt nicht mehr...
ich wer mal die beiden Schreibweisen im Debuggmodus anschauen, vielleicht hilft mir das beim Verständnis ein wenig.
Vielen Dank erstmal für die Antworten.
-
Hunter S Thompson schrieb:
Big Brother schrieb:
Wer bietet mehr ?
In meiner stdlib.h steht das:#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
Das versteh ich nun leider überhaupt nicht mehr...
das bedeutet: wenn diese stdlib.h von einem C-programm includiert wird, dann ist NULL ein void* mit dem wert 0. in einem c++ programm ist es eine einfache 0 (typ: int). vielleicht gibts sogar einen grund, warum sich c++ in diesem punkt von C unterscheidet.
-
so, jetzt nochmal...
int main(int argc, char* argv[]) { char textbuffer[buffersize]; // Char-Array (Char-Feld) der Größe Buffersize char *adr; // ein Zeiger auf die Char-Variable adr char code; int vokale; printf("Texteingabe: "); adr = gets (textbuffer); // textbuffer wird mit Hilfe der Funktion gets beschrieben und auf adr kopiert if ( adr != NULL ) // { printf("Eingabe erfolgreich: %s ", textbuffer); printf(" \n"); } else printf("Eingabefehler! \n"); break;
Also in Zeile 9 wird mit Hilfe der Funktion gets mein Array Textbuffer beschrieben und gleichzeitig auf adr kopiert.
Was ist adr für ein Typ? Char, ok, aber ist es ein Feld oder eine Variable? Ich denke es ist eine Variable die immer das erste Zeichen der Zeichenkette bekommt.
Also kurzes Bsp.: Wir geben ein: halloTestIm Feld Textbuffer steht natürlich: halloTest
in adr steht: h ???lautet Zeile 10 if ( adr != NULL ) dann ist die eingabe erfolgreich wenn gets funktioniert hat.
Unverständlich ist mir aber immernoch der Typ von adr und wozu ich es überhaupt brauche. Zeile 10 hätte ja auch heißen können if ( textbuffer != NULL ), oder doch nicht?Schreib ich aber in Zeile 10 if ( *adr != NULL ) wird doch nur das erste Zeichen von adr mit "Zeilenvorschub" verglichen,
gibt jemand nur enter ein wäre dies eine falsche eingabe da dann *adr == NULL ist.Warum passiert das aber nicht im fall ohne * : if ( adr != NULL ) ??
Wird dort eine Leereingabe gemacht, also einfach enter gedrückt wird das if ausgeführt.Ich bin total verwirrt und mein buch hilft mir nicht weiter. Vielleicht versteht jemand mein Problemchen und kann mir das erklären. Danke
-
Hunter S Thompson schrieb:
Also in Zeile 9 wird mit Hilfe der Funktion gets mein Array Textbuffer beschrieben und gleichzeitig auf adr kopiert.
jein. das mit dem textbuffer ist richtig, aber auf 'addr' wird nichts kopiert, sondern addr wird danach die adresse des ersten elements von 'textbuffer' zugewiesen, oder 0, wenn ein fehler passiert ist.
Hunter S Thompson schrieb:
Was ist adr für ein Typ? Char, ok,
nö, es ist ein char*, ein 'char pointer', eine variable, die die adresse einer char-variablen aufnehmen kann.
Hunter S Thompson schrieb:
Ich denke es ist eine Variable die immer das erste Zeichen der Zeichenkette bekommt.
nö, 'addr' zeigt auf das erste zeichen der zeichenkette. das zeichen selbst ist nur einmal vorhanden, nämlich in textbuffer[0].
-
deine Verwirrung entsteht dadurch, dass du nicht weißt, was genau gets (btw. verwendet lieber fgets) zurückliefert. gets bw. fgets liefern im Fehlerfall NULL zurück, d.h. einen NULL-Pointer. Im Erfolgfall liefern sie den Zeiger auf den Buffer, wo die Daten geschrieben wurden:
char buffer[1024]; char *pointer; /* sicherer als gets(buffer); */ pointer = fgets(buffer, sizeof(buffer), stdin);
- So, im Fehlerfall ist pointer == NULL, d.h. pointer zeigt auf eine ungültige Stelle im Speicher. Du kannst also über 'pointer' nichts referenzieren (sowas machen wie *pointer oder pointer[0]). D.h. wenn du versuchst Inhalt über einen NULL-Pointer zu lesen/schreiben, wird dein Programm krachen.
- Im Erfolgfall zeigt pointer auf den Buffer, wo fgets den Inhalt geschrieben hat. D.h. 'pointer' zeigt auf 'buffer'. Anders gesagt: pointer == &(buffer[0]). Du kannst über 'pointer' auch auf den Inhalt von 'buffer' zugreifen, indem du referenzierst. *pointer ist dann äquivalent zu buffer[0]; Wenn du überprüft if(*pointer == ETWAS), dann überprüfst du im Wirkclichkeit if(buffer[0] == ETWAS).
Bei dir ist 'adr' ein char-Pointer, 'textbuffer' ein char-Array (oder Feld). D.h. 'adr' zeigt auf 'textbuffer', wenn gets/fgets erfolgreich waren.