10.9 char-Arrays und Zeiger
Was wir zu den Zeigern mit Arrays zuvor beschrieben haben, gilt natürlich auch in Bezug auf Zeiger mit Strings (alias char-Array). Nur gibt es zwischen dem char-Zeiger und dem char-Array einen kleinen Unterschied, den Sie unbedingt kennen müssen:
Bei einer Array-Deklaration wie
char str[] = "hallo";
wird wirklich ein Array mit sechs Elementen angelegt, um den String "hallo" zu speichern. Das letzte Element ist dann in der Tat \0. Der Bezeichner str ist dabei eine konstante Anfangsadresse des Arrays und kann nicht geändert werden.
Deklarieren Sie hingegen eine Zeigerversion wie
char *str = "hallo";
wird extra Speicherplatz für den Zeiger verwendet. Hiermit legen Sie praktisch den Zeiger str an, der auf den Anfang, also das Zeichen h im konstanten String "hallo", zeigt. Der String "hallo" selbst befindet sich dann irgendwo anders im Speicher. Des Weiteren ist es hier auch zeigertypisch möglich, die Adresse, auf die str verweist, zu ändern.
Es folgt ein kleines Beispiel:
char *str1 = "hallo";
char str2[] = "welt";
printf("%s\n", str1); // hallo
str1 = str2; // zeigt jetzt auf den Anfang von str2
printf("%s\n", str1); // welt
Hier wurde die Anfangsadresse des Zeigers str1 geändert. Sie zeigt jetzt auf die Anfangsadresse von str2. Wenn Sie allerdings den Zeiger str1 auf str2 verweisen lassen, ist der String "hallo", auf den der Zeiger str1 zuvor gezeigt hat, im Speicher zwar noch vorhanden, aber es gibt keine Möglichkeit mehr, um auf ihn zuzugreifen, weil die Adresse nirgendwo gespeichert wurde. Unser Tipp ist deshalb: Geben Sie direkt bei der Deklaration eines Strings, den Sie durch das Programm noch verändern wollen, die maximale Anzahl von Zeichen an, die Sie speichern wollen. Dabei darf es ruhig etwas mehr sein, als Sie wirklich benötigen, z. B. mit:
char str1[50] = "hallo welt"; // Jetzt sind Sie wirklich auf der sicheren Seite!