C-Strings
-
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.
-
Kellerautomat schrieb:
Stell dir einen Papierstreifen vor. Den Papierstreifen teilst du in gleich grosse Kaestchen auf.
Der C++-Standard gibt nicht vor, dass der Speicher ein zusammenhängendes char-Array ist.
-
language lawer schrieb:
Kellerautomat schrieb:
Stell dir einen Papierstreifen vor. Den Papierstreifen teilst du in gleich grosse Kaestchen auf.
Der C++-Standard gibt nicht vor, dass der Speicher ein zusammenhängendes char-Array ist.
Der C++-Standard gibt auch nicht vor, dass man sich Speicher als Papierstreifen vorstellen kann und dass es Kästchen hat.
-
language lawer schrieb:
Kellerautomat schrieb:
Stell dir einen Papierstreifen vor. Den Papierstreifen teilst du in gleich grosse Kaestchen auf.
Der C++-Standard gibt nicht vor, dass der Speicher ein zusammenhängendes char-Array ist.
Keiner hat davon gesprochen, dass es der einzige Papierstreifen ist.
-
Arcoth schrieb:
language lawer schrieb:
Kellerautomat schrieb:
Stell dir einen Papierstreifen vor. Den Papierstreifen teilst du in gleich grosse Kaestchen auf.
Der C++-Standard gibt nicht vor, dass der Speicher ein zusammenhängendes char-Array ist.
Keiner hat davon gesprochen, dass es der einzige Papierstreifen ist.
Sein System der Adressierung funktioniert dann aber nicht mehr.
-
Kellerautomat schrieb:
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.Also nochmal die Frage. Wenn ich den Zeiger int *p; deklariere dann verweißt dieser auf keine Speicherzelle?
Erst wenn ichp = new int;
oder
p = &i
schreiben würde?
Nexus schrieb:
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.
Und danke
-
Skeptar schrieb:
Also nochmal die Frage. Wenn ich den Zeiger int *p; deklariere dann verweißt dieser auf keine Speicherzelle?
Erst wenn ichp = new int;
oder
p = &i
schreiben würde?
ja, er zeigt einfach irgendwo hin. dann zu lesen / schreiben, ohne ihn auf ein objekt zeigen zu lassen, wäre ub.