Beispiel mit Zeigern - einige Fragen
Verfasst: Fr Mär 07, 2014 1:01 pm
Hallo!
folgendes Beispiel vertauscht zwei String miteinander:
Folgende Fragen habe ich dazu:
1.
Warum darf ich bei printf()-Funktion nicht *String1 und *String2 schreiben (mit dem Zeigeroperator)? Schließlich will ich ja hier den Inhalt der Speicherstelle anzeigen und nicht die Adresse, worauf der Zeiger zeigt. Wenn ich mit * versuche, stürzt das Programm ab.
2.
Warum sehe ich beim String2 keine richtige Ausgabe, sondern nur irgendwelche Zeichen, aber mit String1 klappt es einwandfrei.
4.
Warum ist bei der letzten printf()-Funktion die Ausgabe von String2 komplett leer (siehe oben)?
5. Warum muss ich bei der Parameterübergabe mit Arrays ohne Adressoperatoren arbeiten?
Also warum geht &Text1, &Text2 nicht (mit dem Adressoperator)? Ich weiß, dass Arrays Zeiger sind, und Zeiger haben 3 Werte: ihre eigene Adresse im Speicher, Adresse auf die sie Zeigen und den Inhalt der Speicherstelle. Und wenn ich an den Parameter ihre eigene Adresse weitergebe, und nicht die Adresse wohin sie zeigen, was passiert dann (also statt funk(Zeiger) -> funk(&Zeiger)?
Danke!
PS: Wo/wie kann ich hier einstellen, dass ich C-Code benutze? Damit die Formatierung besser aussieht.
folgendes Beispiel vertauscht zwei String miteinander:
Code: Alles auswählen
#include <stdio.h>
void strturn(char*, char*);
int main()
{
setbuf(stdout, NULL);
char Text1[50], Text2[50];
puts("Gib einen Text ein:");
gets(Text1);
strturn (Text1, Text2);
printf("Das ist verkehrt:\n%s", Text2);
return 0;
}
void strturn(char *String1, char *String2)
{
char *Start = String1;
printf("Start: %s\n", Start);
while (*String1 != '\0') String1++;
String1--;
while (String1 >= Start){
printf("String1: %s String2: %s\n",String1, String2);
*String2++ = *String1--;
}
*String2 = '\0';
printf("String1: %s String2: %s\n",String1, String2);
}
1.
Code: Alles auswählen
printf("String1: %s String2: %s\n",String1, String2);
2.
Code: Alles auswählen
printf("String1: %s String2: %s\n",String1, String2);
3. Wie ist die Reihenfolge bzw. was wird zuerst gemacht?Gib einen Text ein:
asdfg
Start: asdfg
String1: g String2: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠asdfg
String1: fg String2: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠asdfg
String1: dfg String2: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠asdfg
String1: sdfg String2: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠asdfg
String1: asdfg String2: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠asdfg
String1: ╠asdfg String2:
Das ist verkehrt:
gfdsa
Wird zuerst String1 dekrementiert, dann String2 inkrementiert und erst dann die Zuweisung gemacht? Verändern String2 und String1 ihre Adressen VOR der Zuweisung, oder erst danach, wenn die Anweisung abgeschlossen ist - also nach Semikolon?*String2++ = *String1--;
4.
Code: Alles auswählen
*String2 = '\0';
printf("String1: %s String2: %s\n",String1, String2);
5. Warum muss ich bei der Parameterübergabe mit Arrays ohne Adressoperatoren arbeiten?
Code: Alles auswählen
strturn (Text1, Text2);
Danke!
PS: Wo/wie kann ich hier einstellen, dass ich C-Code benutze? Damit die Formatierung besser aussieht.