Übergeben Sie einen Zeiger per Referenz
#include <iostream>
using namespace std;
void merge(int *& toMerge, int lo, int mid, int hi)
{
int merged[hi+1];
int i = lo, j = mid+1;
for (int k = lo; k <= hi; k++)
{
if (i > mid) {merged[k] = toMerge[j]; j++;}
else if (j > hi) {merged[k] = toMerge[i]; i++;}
else if (toMerge[j] < toMerge[i]) {merged[k] = toMerge[j]; j++;}
else {merged[k] = toMerge[i]; i++;}
}
toMerge = merged;
}
int main(int argc, const char * argv[])
{
int x[8] = {1,7,4,6,2,7,3,2};
merge(x, 0, 7, 3);
return 0;
}
Ich versuche einen Zeiger übergeben durch Referenz hier, so dass das Ergebnis wird sein, dass der array x
sortiert werden. Aber mein compiler wirft einen Fehler, dass keine passende Funktion aufrufen, für die merge(x, 0, 7, 3)
.
Ich bin mir nicht sicher, warum dies geschieht, weil der merge-Funktion benötigt einen Zeiger, und x
ist ein Zeiger auf das erste element im array -- so sollte es funktionieren. Warum nicht?
x
ist ein array, und nicht einen Zeiger.Sollte nicht
merge(&x[0], 0, 7, 3);
auch arbeiten?Habe ich schon versucht-hat nicht funktioniert
x
Verfall in einen Zeiger auf das erste element. Siehe arrays. Während ich spreche, sollte ich darauf hinweisen, dass int merged[hi+1];
ungültig ist, weil der Größe ist nicht eine compile-Zeit-Konstante.Sie müssen einen Zeiger in
main
das ist ein lvalue (wie eine separate variable). Oder Sie können es ändern, verwenden std::vector
(da die Funktion nicht richtig funktioniert, mit std::array
ohne einige änderungen). Jedenfalls &x[0]
ist kein lvalue. Es ist eine namenlose vorübergehende, die keine Bindung an eine Referenz (es wird zerstört am Ende der Funktion rufen sowieso, also hat es keinen Sinn). Und C++11 nicht. Nicht einmal C++14. Kompilieren mit -pedantic
.
InformationsquelleAutor 1110101001 | 2014-06-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem array zerfällt zu einem Zeiger, wenn Sie übergeben es als argument an eine Funktion zu rufen, aber nicht, um eine Referenz auf einen Zeiger.
: Stell dir vor,
Das können Sie nicht. Sie müssen sich Fragen, ob Sie es brauchen.
InformationsquelleAutor R Sahu
Sollten Sie wirklich NICHT übergeben Sie einen Verweis, weil Sie nicht wirklich wollen
merge
ändern Sie den Wert des Zeigers. Sie wollen einfach nur, um es zu ermöglichen, ändern Sie die Werte in dem array gespeichert, die Sie tun können, ohne die Referenz (d.h., nur durch die Zeiger).Huh? Die array-Werte werden nicht kopiert, wenn die übergabe entweder ein Zeiger oder ein Zeiger auf eine Referenz oder eine Referenz auf einen Zeiger oder eine Referenz.
Nein,
merge()
hat eine syntaktisch korrekte Signatur.T*&
ist eine Referenz auf einen Zeiger, nicht ein Zeiger auf eine Referenz.Ich weiß-wenn ich nur mit dem Cursor und ändern Sie die Werte in dem array gespeichert, ich hätte aktualisieren Sie den jeweiligen Wert in das array mit den sortierten Werte, wobei O(n) Zeit.
Ein weiteres Problem ist, dass int zusammengeführt[hi+1]; hat lokalen Gültigkeitsbereich, und Sie versuchen, es zurück über einen Zeiger. Dieser Zeiger wird dann auf freigegeben Speicher.
InformationsquelleAutor Dwayne Towell