Die Logik der char pointer - Die Frage der Fragen!
-
Das Schlüsselwort new legt eine Variable auf dem heap und
gibt eine Adresse zu dieser zurück.
Ein Pointer auf eine Int nimmt diese Adresse zu der Int
auf. Zahl gibt nun die Adresse zu der Zahl zurück.
Will ich aber den Wert der Int, die der Pointer adressiert,
muss ich den * (wasauchimmer operator in diesem fall)
voransetzen.#include <iostream> using namespace std; int main(int argc, char * argv[]) { int * Zahl = new int; *Zahl = 10; cout << *Zahl << endl; char * Wort = new char; Wort = "hallo"; cout << Wort << endl; char * Wort2 = "hallo2"; cout << Wort2 << endl; system("PAUSE"); return 0; }Wie es sich bei den chars scheinbar abspielt, werde ich wohl nie verstehen!
Ich lasse eine char in den heap setzen und die Adresse dem Pointer
auf eine char zuweisen. Nun weise ich diesem Pointer auf die char eine
Zeichenkette zu. Und ja! Ich weise sie dem Pointer zu und nicht
der Varable auf dem heap, auf den dieser Pointer zeigt!Hilfe! Ich brauche eine stabile Denkweise!
Es geht mir um char Pointer.
Ich weiß schon, dass strings chararrays sind stabiler Länge
und das die Größe vom compiler automatisch zugewiesen
wird wenn man die Blockoperatoren leer lässt und alles.Mir geht es darum, dass ich diese Logik erklärt haben will.
Wie zum Henker funktioniert das?Einem pointer kann doch kein Wert zugewiesen werden
gescheigedenn ein ganzes array!
[Die double quotes in c++ erzeugen ja ein array,
wobei jedes Zeichen ein element ist und geben es mit einem
nullterminierenden \0 zurück]// edit
"sie geben dir nicht das array sondern einen pointer auf das erste element darin zurück"Also wird hier dem char array ein Pointer zugewiesen?
char bla[] = "Hallo";Und wenn sie einen Pointer zum ersten zeichen zurückgeben, wieso gibt
cout << bla << endl;sie dann alle aus?
Antwort woanders:
ja .. du könntest glaube ich genauso folgendes schreiben:
char* bla = "Hallo";"Und wenn sie einen Pointer zum ersten zeichen zurückgeben, wieso gibt
code:
cout << bla << endl;
sie dann alle aus?"
wahrscheinlich weils so gemacht is, dass es alles ausgibt, bis es auf den null-terminator trifft, wenn man nen charpointer übergibt ... genau kann ichs aba auch nich erklären
Nichts gibt ja eigentlich einen Pointer zurück.
Adressen werden zurückgegeben. Pointer sind Variablen, die Adressen speichern.
Wenn die double quotes nun eine Zeichenkette auf dem heap erzeugen und die
Adresse zurückgeben, wie vereinbart sich dann dessen Zuweisung an
ein char array? Eine char Variable speichert immerhin eine Zahl, die ein Zeichen
darstellen soll und keine Zahl, die die Adresse zu einem Zeichen darstellt.char bla[] = "Hallo";Dem char array wird hier doch niemals eine Adresse zugewiesen!?
-
sjBlack schrieb:
...
... char * Wort = new char; Wort = "hallo"; // MEEEEEP: Pointer umgebogen ...Was sich danach abspielt, braucht nicht weiter diskutiert zu werden - Du arbeitest jedenfalls nicht auf dem (eh viel zu kleinen) allozierten Speicher, sondern auf dem, in dem "hallo" steht.
Das hat auch nichts mit "char" zu tun, sondern würde mit int auch nicht funktionieren:int * Zahl = new int; Zahl = 10; // Meeep auch hier versuchst Du, den Zeiger "Zahl" umzubiegenMerke: Sternchen sind in C/C++ nicht zum Spaß da !!

Gruß,
Simon2.
-
Ein String-Literal ist ein char-Array, das irgendwo im Datensegment deines Programms darauf lauert, verwendet zu werden. Arrays können implizit umgewandelt werden in Zeiger (auf das erste Element des Arrays) - d.h. du biegst mit der Zuweisung
Wort="Hallo";den Zeiger 'Wort' um auf den Anfang des String-Literals "Hallo" (und verlierst dabei die Adresse des char, den new auf dem Heap hinterlegt hat).Aber natürlich kannst du auf chars genauso über * (btw, der nennt sich "Dereferenzierungsoperator") zugreifen wie auf ints:
char* zeichen = new char; *zeichen = 'X'; cout<<*zeichen<<endl;(umgekehrt kannst du einen int-Zeiger auch auf den Anfang eines int-Arrays zeigen lassen - auch wenn es keine Entsprechung zum String-Literal für int gibt)
PS: Und die IO-Streams betrachten char-Zeiger anders als z.B. int-Zeiger - sie nehmen an, daß der Zeiger auf ein (nullterminiertes) Zeichen-Array verweist und geben den Inhalt dieses Arrays aus.