Vertauschen Sie zwei Variablen mit Zeigern
Bin ich zu schreiben versucht, eine swap-Funktion mit Zeiger(speziell ein void-Zeiger)-Referenz, aber mein code nicht funktioniert. Hier ist mein code:
void swap(void *p1,void *p2)
{
int temp;
temp=*((int*)p2);
p2=p1;
p1=&temp;
}
int main()
{
int i=4;
int j=5;
cout<<i<<j<<endl;
swap(&i,&j);
cout<<i<<j<<endl;
return 0;
}
Wohin gehe ich falsch?
Dieser defekt ist in einer Menge weisen, aber das wichtigste Problem (IMO) ist die Zuordnung
Sie müssen übergeben Sie den Zeiger per Referenz ?
Da Sie austauschen ints, brauchen Sie nicht zu pass-Parameter für die Funktion als Hohlräume.
p1
,p2
mit Werten, während Sie tatsächlich benötigen, weisen Sie der Adresse, die Sie ansprechen. Dies ist nicht das einzige Problem, nur das wichtigste IMO.Sie müssen übergeben Sie den Zeiger per Referenz ?
Da Sie austauschen ints, brauchen Sie nicht zu pass-Parameter für die Funktion als Hohlräume.
InformationsquelleAutor dead programmer | 2012-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der code funktioniert nicht, weil Sie nicht dereferenzieren von Zeigern auf Zuweisungen. Es sollte
Beachten Sie, dass Sie machen eine Annahme, dass
void*
Punkte zu einemint
werden, was offensichtlich nicht immer der Fall. Im wesentlichen, könnte man genauso gut ersetzenvoid*
mitint*
, und loszuwerden des casts.Einer allgemeineren Fall der API sollte wie folgt Aussehen:
Intern die API sollte reservieren eines Puffers der Größe
sz
, einememcpy
hinein, und dann ein swap, wieder mitmemcpy
.Recht-im wesentlichen ergibt dies einen trivial-swap-Speicher-Inhalt in nicht-überlappende Regionen.
InformationsquelleAutor dasblinkenlight
Im Körper der Funktion, Sie sind durch das vertauschen der Werte von
p1
undp2
; Sie wollen nicht, das zu tun. Sie möchten, vertauschen Sie die Werte von dem, wasp1
undp2
Punkt zu:Ich weiß, Sie wollte
void *
für Ihre Argumente. Nicht. Würden Sie haben, um Sie zu werfen, um den entsprechenden Ziel-Typ zur Durchführung der Aufgaben sowieso:Igitt. Sie sind sich nicht speichern selbst etwas, indem Sie die Argumente
void *
.Da bist du offensichtlich schreiben von C++ ist, kannst du die generische Funktion, die eine Vorlage verwenden:
Sogar noch besser, verwenden Sie eine Vorlage und Referenzen, du bist also nicht der Umgang mit Zeigern an alle:
InformationsquelleAutor John Bode
mit memory-Funktionen
wenn wir noch nicht wissen-Daten geben, dann nutzen wir void.
template <typename T>
wenn wir nicht wissen, die Art noch nicht. Der compiler wissen, verwenden Sie den Typ realT
und dann auf Fehler prüfen. Das ist, warum wir habentemplate <typename T> std::swap(T&, T&)
InformationsquelleAutor ɹɐqʞɐ zoɹǝɟ
Den Sie Bearbeiten, Kopien der Zeiger, nicht den Inhalt.
Sollten Sie so etwas tun (zeigen Sie auf die Idee, dies würde nicht funktionieren ohne wirft und es wäre immer noch nicht eine gute Idee, mit):
Sind Sie gehen zu müssen, Zeiger auf Zeiger, wenn Sie wollen, tauschen Sie Ihre Hinweise geben:
oder Referenzen auf Zeiger:
Oder, da du dich offensichtlich mit C++, könnten Sie Referenzen und Vorlagen zu tauschen, jede Art von Daten. Aber sind Sie sicher, dass Sie alles verstanden, die Grundlagen der Sprache?
Glück
InformationsquelleAutor cmc
Versuchen Sie dies:
Bevor Sie dereferenzieren Sie die Zeiger a und b, müssen Sie zuerst konvertieren Sie Sie in
int*
. Nach, dass Sie nur ausführen tauschen.Hinweis: Sie nicht brauchen, pass
void*
als parameter. Wenn Sie passint*
s, es wird auch richtig (und besser lesbar).Hinweis[2]: Da Sie Programmieren in C++ könnte man anstelle von Zeigern verweist.
InformationsquelleAutor Rontogiannis Aristofanis
versuchen folgenden code:
InformationsquelleAutor Hamza
Tauschen Sie den Inhalt von p1 und p2 in der Fahrer-Funktion
code funktioniert nicht. Dies ist wahrscheinlich, weil Sie versuchen, die swap-Speicher-Adresse Start und os beschränkt. ??
Die Speicher-Funktionen aber macht die Arbeit.
InformationsquelleAutor John