C-Strings
-
Ich habe mal ein wenig code hier:
const char *str = "ABC"; str="neuer Text";
Dazu habe ich drei Fragen:
1. Warum kann str verändert werden wenn ein "const" davor steht?
2. Was ist ein Stringliteral?
3 ist *str das gleiche wie str[i]?
-
1. Warum kann str verändert werden wenn ein "const" davor steht?
Weil sich das
const
auf den Pointee, und nicht auf den Zeiger bezieht. i.e., du kannst den Zeiger verändern, aber nicht, worauf der Zeiger zeigt. Alles was du in der zweiten Zeile tust, ist, dem Zeiger einen neuen Wert zuweisen.2. Was ist ein Stringliteral?
RTFM.
3 ist *str das gleiche wie str[i]?
Nein. Für Zeiger ist
str[i]
ist äquivalent zu*(str + i)
.
Dagegen ist*str
äquivalent zustr[0]
.
-
Und was ist nun ein Stringliteral? :s
-
Such doch mal bei Wikipedia nach Literal.
-
Also ein Literal für C-Strings ist eine durch Anführungszeichen begrenzte Zeichenfolge?
-
Arcoth schrieb:
Für Zeiger ist
str[i]
ist äquivalent zu*(str + i)
.
Dagegen ist*str
äquivalent zustr[0]
.Das hier keine Missverständnisse auftreten:
Das gilt nur für die Zuweisung mit Zeigern. Nicht für die Definition oder Deklaration.
-
Skeptar schrieb:
Also ein Literal für C-Strings ist eine durch Anführungszeichen begrenzte Zeichenfolge?
Ja, auch das Objekt im Speicher, das diese Zeichenfolge zur Laufzeit repräsentiert.
-
Okay danke für die Antworten!
-
Ich hätte nochmal eine Frage.
Ist das hier beides das gleiche?char str1[] = "Hallo";//1. const char *str1 = "Hallo";//2.
Und wenn ja setzt der Compiler das ersten in das zweite um?
-
Das zweite ist const, das erste nicht. Beim ersten geht str1[0] = 'B', beim zweiten nicht. Beim ersten hast du immer 6 chars an Speicher für das "Hallo" sodass char str2[] = "Hallo" wieder 6 chars an Speicher (Plus den Zeiger) benötigt, während const char *str2 = "Hallo" auf das identische "Hallo" zeigt und damit insgesamt nur einmal Speicher für das "Hallo" benötigt, nicht zwei Mal.
-
Okay danke erstmal vll. frage ich später nochmal etwas
-
Nächste Frage
int *p; // Zeiger auf int p = new int; // Wird hier eine "Speicherzelle" vom Typ in erstellt? *p = 15; // Wert zuweisen
Frage steht im Code
-
Ja, zumindest kann man das so sehen.
-
Also mein post war ..
Unnötig...Danke
-
Was soll denn bitte eine "Speicherzelle" sein? Die Beschreibung ist Mist...
-
Kellerautomat schrieb:
Was soll denn bitte eine "Speicherzelle" sein? Die Beschreibung ist Mist...
Öhm...
Dachte soetwas wie eine Variable das vll eine Variablen Speicherzelle (keine Ahnung kann es nicht besser Beschreiben deswegen frage ich ja) erstellt wird wo ein Wert gespeichert werden kann und darauf verweißt der Zeiger.
-
Skeptar schrieb:
Also mein post war ..
Unnötig...War er nicht, lass dich nicht so schnell verunsichern. Deine Vorstellung einer Speicherzelle im RAM, auf die ein Zeiger verweist, ist durchaus sinnvoll.
Nur würde ich statt "erstellen" eher "belegen" sagen, man spricht in dem Zusammenhang auch von Speicherallokation.
-
Okay super.
Und wird für den Zeiger ohne Zuweisung auf eine Adresse den Speicher benötigt?
-
Ja. In deinem Fall hast du den Zeiger als
int *p;
deklariert, er liegt also im automatischen Speicherbereich ("Stack").Das Objekt selbst benötigt immer gleich viel Speicher, egal welcher Wert drin steht. Das gilt auch für Zeiger.
-
Von *einer* Speicherzelle zu sprechen halte ich einfach fuer falsch. Man koennte von sizeof(int) Speicherzellen sprechen, aber auch das finde ich noch unschoen.
Stell dir einen Papierstreifen vor. Den Papierstreifen teilst du in gleich grosse Kaestchen auf. Jedes Kaestchen ist breit genug fuer eine 8-stellige Binaerzahl (ein Byte). Du nummerierst die Kaestchen der Reihe nach durch, faengst bei 0 an und nummerierst so lange, wie dein Streifen lang ist.
Wenn du jetzt einen int mit new allozierst, dann werden 4 aufeinanderfolgende Kaestchen (ein int bei dir vermutlich ist 4 Byte gross) gesucht, in denen noch keine Zahlen stehen. Wenn passende Kaestchen gefunden wurden, dann wird dir die Nummer des ersten Kaestchens gegeben. Das ist dann dein Pointer: Eine Zahl, eine Nummer.