Tauschen von Zeigerwerten
-
Hi, ich programmiere erst seit ca. 4 Wochen und habe ein Problem mit folgender Aufgabe:
"Tauschen Sie die Zeigerwerte so, dass anschließend u auf b und v auf a zeigt. Die Inhalte von a und b sollen unverändert bleiben. Außerdem dürfen die Variablen a und b beim Tauschen von u und v nicht verwendet werden."Bis jetzt habe ich folgendes:
#include <iostream>
using namespace std ;void tausche_p(int *u, int *v) {
int h = *u;
*u = *v;
*v = h;}
int main() {
int a = 47;
int b = 11;
int *u= &a;
int *v= &b;
cout<<"---Vor dem Tausch---"<<endl;
cout<< "\t " << "Adresse \t"<< "Inhalt \t " << " referenzierter Wert \t"<<endl;
cout<< "Variable a "<< &a<<"\t"<< *&a<<endl;
cout<< "Variable b "<< &b<<"\t"<< *&b<<endl<<endl;
cout<< "Zeiger u "<< &u<<"\t"<< *&u<<"\t"<< *u<<endl;
cout<< "Zeiger v "<< &v<<"\t"<< *&v<<"\t"<< *v<<endl<<endl;
tausche_p(&a, &b);
cout<<"---Nach dem Tausch---"<<endl;
cout<< "Variable a "<< &a<<"\t"<< *&a<<endl;
cout<< "Variable b "<< &b<<"\t"<< *&b<<endl<<endl;
cout<< "Zeiger u "<< &u<<"\t"<<endl;
cout<< "Zeiger v "<< &v<<"\t";
cin.get();Mein Problem ist jetzt, das hier leider die Werte von a und b getauscht werden was natürlich nicht der Aufgabe entspricht. Ich brauche also einen neuen Ansatz um die Aufgabe lösen zu können.
Wundert euch nicht über die Ausgabe, denn die soll folgende Struktur haben:--- Vor dem Tausch ---
Adresse Inhalt referenzierter Wert
Variable a 0xbf941088 69
Variable b 0xbf941084 31
Zeiger u 0xbf941080 0xbf941088 69
Zeiger v 0xbf94107c 0xbf941084 31
--- Nach dem Tausch ---
Adresse Inhalt referenzierter Wert
Variable a 0xbf941088 69
Variable b 0xbf941084 31
Zeiger u 0xbf941080 0xbf941084 31
Zeiger v 0xbf94107c 0xbf941088 69
(Danke schonmal für eure Hilfe
}
-
Du sollst die Zeiger tauschen, also nicht derefernzieren innerhalb deiner Tauschfunktion.
template <typename T> void swap(T &u, T &v) { T w = u; u = v; v = w; }
Und dann einfach so verwenden:
int a=47, b=11; int *u = &a; int *v = &b; swap(u, v);
Überleg dir mal noch was passiert wenn du
swap (a,b)
aufrufst
Edit: jupp hast recht, war zu schnell, danke.
-
@Threadersteller: Wenn du die Zeiger vertauschen willst, musst du eine Indirektionsebene höher gehen, also Zeiger auf die Zeiger übergeben und dann diese nach dem gleichen Schema vertauschen, wie du es jetzt bei den Werten machst.
-
Danke für die Antworten, aber leider kann ich mit dem Tipp,
Wenn du die Zeiger vertauschen willst, musst du eine Indirektionsebene höher gehen, also Zeiger auf die Zeiger übergeben und dann diese nach dem gleichen Schema vertauschen, wie du es jetzt bei den Werten machst.
recht wenig anfangen. Wie soll ich denn einen Zeiger auf einen Zeiger übergeben?
-
void tausche_p(int **u, int **v) // u und v sind nun Zeiger auf Zeiger auf int
Über den Rest darfst du erst einmal selber nachdenken.
P.S.: Eleganter und einfacher wären ja eigentlich Referenzen statt Zeigern, aber dein Lehrwerk scheint eher vom gefürchteten "C++ ist C mit Klassen/cout"-Typus zu sein. Daher nehme ich mal an, dass das Wort "Referenz" noch nie vorgekommen ist.
-
Bitte selber lösen!
-
Nachdem Du gerade krachend beim versuchten Schummeln erwischt worden bist, hast Du Dich sicherlich ordentlich auf den Hintern gesetzt und Dich intensiv mit der
tausche_p
Funktion beschäftigt. Insbesondere nach SeppJs Anstößen.Da ich prinzipiell kein Problem damit sehe, Deinen Code hier weiter zu diskutieren - solange niemand Deine Übungen löst - will ich auf die Ausgabe eingehen.
cout<<"---Vor dem Tausch---"<<endl; cout<< "\t " << "Adresse \t"<< "Inhalt \t " << " referenzierter Wert \t"<<endl; cout<< "Variable a "<< &a<<"\t"<< *&a<<endl; cout<< "Variable b "<< &b<<"\t"<< *&b<<endl<<endl; cout<< "Zeiger u "<< &u<<"\t"<< *&u<<"\t"<< *u<<endl; cout<< "Zeiger v "<< &v<<"\t"<< *&v<<"\t"<< *v<<endl<<endl;
Das ist wohl die erste Idee, die man hat, das gewünschte Format zu verwirklichen. ein wichtiger Grundsatz der Programmierung ist allerdings Don't repeat yourself (DRY).
D.h., wenn du eine Sache mehrfach machen sollst, schreibst Du eine Funktion dafür.
Das erleichtert das lesen, das spätere verstehen und Du kannst Änderungen zentral an einer Stelle erschlagen.Ich hab da mal was vorbereitet...
#include <iostream> #include <string> // string #include <iomanip> // setw #include <algorithm> // swap using namespace std ; /* gibt einen int schoen aus */ void print(const string& s, const int& i){ cout << s << '\t' << &i << '\t' << setw(14) << *&i << '\n'; } /* gibt einen int* schoen aus */ void print(const string& s, int* const& z){ cout << s << '\t' << &z << '\t' << *&z << '\t' << setw(14) << *z << '\n'; } int main() { int a = 47; int b = 11; int *u= &a; int *v= &b; cout << "---Vor dem Tausch---\n" "\t\tAdresse\t\tInhalt\t\treferenzierter Wert\n"; print("Variable a", a); print("Variable b", b); print("Zeiger u", u); print("Zeiger v", v); swap(u,v); // das ist zwar eine Lösung, aber // keine genügende Leistung im Sinne d. Aufgabe // Kurz: wenn Du das einreichst ist Dir nicht mehr // zu helfen! :) cout << "---Nach dem Tausch---\n"; print("Variable a", a); print("Variable b", b); print("Zeiger u", u); print("Zeiger v", v); }
Ich denke das ist Code, den man nach 4 Wochen C++ "verstehen können könnte", z.B.:
void print(const std::string& s, const int& i){ cout << s << '\t' << &i << '\t' << setw(14) << *&i << '\n'; }
Hier musst Du eigentlich nur ungefähr wissen, was ein
string
ist, und was es bedeutet, Funktionsargumente über Referenzen zu übergeben.
Dassetw(14)
setzt die Weite der Ausgabe auf 14 Zeichen, dass sieht bei mir schön aus, weil Zeiger auch mit einer Weite von 14 Zeichen ausgegeben werden.
Ferner habe ich dieendl
durch das Zeichen '\n' (newline) ersetzt, da Du ja nur Umbrüche an den jeweiligen Stellen haben willst.Was ich mir noch zu nutze mache: die sogenannte Überladung, d.h. dass je nach Argument die richtige Version von
print()
gewählt wird.Wenn Du das erstmal so akzeptierst: gut!
Referenzen und Überladung genau zu verstehen ist IMHO erstmal gar nicht nötig.Wo lernst Du denn C++?