Pointer oder nicht?

GuenterMies

Grünschnabel
Hallo Maedels,

habe mal ne einfache Grundkenntnisfrage.
Mich wuerde interessieren was der Compiler in unterem Beispiel austauscht...die Pointer auf die Inhalte oder die Inhalte selbst?
Mir ist schon bewusst das ich, wenn ich beide Komponenten anzeige optisch einen tausch der Inhalte vornehme.
Mich interessiert aber was wirklich im Innern des Rechners getauscht wird.

Gruss
Günni
Code:
   CString *r = new CString[10]; 
   CString *s = new CString[8]; 
   r[1]="Franz"; 
   s[1]="Susi"; 
   m_ausgabe1=r[1]; 
   m_ausgabe2=s[1]; 

   r[1] = s[1]; 
   m_ausgabe3=r[1]; 
   m_ausgabe4=s[1]; 
   UpdateData(false);
 
Hm, hier ein paar Anmerkungen:

- Die CStrings, die du mit r[1] bzw. s[1] ansprichst, werden kopiert.

- Nach "r[1] = s[1]; " enthalten beide CString den gleichen Text (also keine Vertauschung).

- Am Ende erhältst du Ressourcenlecks für 18 CString-Objekte, weil du deine CString-Arrays nicht mit delete[] freigibst.

Wozu brauchst du eigentlich Arrays von CStrings?
 
Fortsetzung...

Weitere Anmerkungen:
- in C/C++ sind Arrays immer noch Null basiert, also myarr[0] ist das 1. Element.
- warum verwendest du kein CStringArray?

Gruß Homer
 
ja ihr habt schon recht

natuerlich wird nicht getauscht sondern gleichgesetzt (war schreibfehler von mir...hektik;) )

und dass ein array bei 0 beginnt weiss ich auch...haette auch 7 reinschreiben koennen

aber meine eigentliche frage habt ihr nicht beantwortet....:rolleyes:

was wird reel von dem compiler gleichgesetzt?....der pointer auf die strings?
oder die inhalte auf die die pointer zeigen


ICH VERSUCH ES MAL ZU VERDEUTLICHEN WORAUF ICH AUS WILL:

r[1] beinhaltet pointer auf adresse 7000 und dort steht "Franz"
s[1] beinhaltet pointer auf adresse 8000 und dort steht "Susi"

nun mache ich: r[1]=s[1];

was wird nun wirklich passieren?
r[1] ist immer noch adresse 7000 mit "Susi"
s[1] ist immer noch adresse 8000 mit "Susi"
ODER:
r[1] ist nun adresse 8000 mit "Susi"
s[1] ist immer noch adresse 8000 mit "Susi"


:)
 
Die CString Klasse hat den Operator = überladen. Das "=" KOPIERT jetzt einen CString in einen anderen. D.h. wenn du zwei CStrings hast, und du setzt sie gleich, sind das nach wie vor zwei individuelle Objekte, wohingegen zwei char* -Typen auf die selbe Speicheradresse zeigen würden.
Aber bei deiner vorgehensweise mit Zeigern machst du sowieso einen logischen Fehler, weshalb dich hier wohl auch alle bisher misverstanden haben.
Ein CString* ist ein Pointer auf ein CString-Objekt. Du initialisierst das Ding jetzt mit new. Allerdings erzeugst du mehr als ein CString-Objekt durch deine Indizes (10 und 8). Du hast damit 10 bzw. 8 eigene CString Objekte erzeugt. Die CString* Variable zeigt auf das erste Element. Durch den Elementzugriff durch [n] wird jetzt das n. Element angesprochen. Die Elemente sind aber vom Typ CString (nicht CString*), d.h. es sind überhaupt KEINE POINTER und deshalb verhalten sie sich auch nicht wie Pointer beim gleichsetzen!
Wenn du ein Array aus CString-Zeigern haben möchtest, dann musst du das als CString** deklarieren und mit new initialisieren, dann ist jedes Element vom Typ CString*. Jedes Element muss dann noch mit new initialisiert werden und wenn du dann jedes Element gleichsetzt ist das eine solche Pointergleichsetzung nach der du fragst, also das zwei Variablen auf die selbe Adresse zeigen und sich damit nicht unabhängig von einander ändern.
 
holdriho

das hoert sich ziemlich logisch an, obwohl es nicht so ist...wie ich mittlerweile rausgefunden habe.

ich bin naemlich dummerweise erst vor einer stunde drauf gekommen meinen code einmal vom embedded compiler in den visual c++ 6.0 compiler zu kopieren und dort zu debuggen

und beim debuggen konnte ich schoen beobachten, das beiden CString* eine eigene Adresse zugewiesen wurde um dort ihre CStrings abzulegen

nachdem ich dann r[1]=s[1]; ausgefuehrt habe erhielt nun r[1] exakt die gleiche adresse wie s[1], was bedeutet:

ICH KOPIERE POINTER :)

gruss
Günni
 
Richtig.
Du solltetst dir noch die Frage stellen, was du möchtest?
Willst du "Kopien" haben oder willst du nur Zeiger, bzw. Referenzen haben?.
Außerdem sollte man auch etwas Vorsichtig sein, denn Obwohl "Koipien" manchmal etwas Zeit und Speicher kosten sind sie in manchen Fällen besser, bzw. Sicherer.
Denn wenn man ein Objekt zerstört, auf das referenziert wird per Referenz oder Zeiger, kann das böse Auswirkungen haben, wenn man auf die Referenz/Zeiger zugreift. (Absturz).
Also sollte man da genau wissen was man tut.

Gruß Homer
 
richtig ist falsch!....denke ich :)

du hast natuerlich recht was die referenzen angeht...man muss dann wissen was man tut

ich moechte in meiner matrize einfach alle zeilen sortieren und fuehre deshalb einen dreieckstausch einzelner zeilen durch

und dabei kann ich ruhig mit zeigern arbeiten, da die zeilen immer nur einmal bestehen muessen ;)

gruss
Günni

achso: danke fuer euren einsatz!
 
Und trotzdem ist beim einem Array das als CString* deklariert wurde, das einzelne Element ein CString (!) und KEIN Zeiger auf ein CString und deswegen wird beim Gleichsetzen auch DAS OBJEKT KOPIERT und nicht einfach ein Zeiger. Und normalerweise ist der Operator = auch dahingehend überladen, dass beim gleichsetzen von CStrings kopiert und der interne char* Zeiger nicht einfach gleichgesetzt wird (sondern brav mit strcpy oder so kopiert).
 
Um auch noch die letzten Klarheiten zu beseitigen, möchte ich darauf hinweisen, dass meines Wissens CString ein Referenzzähler ist. Das bedeutet, dass sich mehrere CStingobjekte ein und dasselbe char-Array teilen können, solange der jeweilige CString noch nicht modifiziert wurde.
 
Zurück