Ü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

Schreibe einen Kommentar