2013-07-21 4 views
16

Ich versuche Wert in Funktion zu senden Referenzzeiger verwenden, aber es gab mir einen völlig fremden Typ Fehler mirC++ Anfangswert Bezug auf nicht-const muss ein L-Wert sein

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

void test(float *&x){ 

    *x = 1000; 
} 

int main(){ 
    float nKByte = 100.0; 
    test(&nKByte); 
    cout << nKByte << " megabytes" << endl; 
    cin.get(); 
} 

Fehler: Anfangs Wert des Verweises auf non-const muss ein lvalue sein

Ich habe keine Ahnung, was ich tun muss, um obigen Code zu reparieren, kann mir jemand einige Ideen geben, wie man diesen Code repariert? Dank :)

+1

Können Sie einfach den Zeiger fallen, Verwendung eine einfache Referenz stattdessen? –

+0

haha, jetzt, weil ich im folgenden Tutorial bei learncpp.com und dieser Seite lerne mich Referenzzeiger in Funktion zu verwenden, so will ich es auch versuchen ..: p btw danke @Micha Wiedenmann –

+0

Verwenden Sie einen Verweis auf einen Zeiger nur wenn Sie möchten einen Zeiger außerhalb der Funktion ändern. –

Antwort

31

Wenn Sie einen Zeiger durch eine nicht const Referenz übergeben, sagen Sie dem Compiler, dass Sie den Wert dieses Zeigers ändern werden. Dein Code tut das nicht, aber der Compiler denkt, dass es das tut oder plant, es in der Zukunft zu tun.

diesen Fehler zu beheben, entweder x Konstante

// This tells the compiler that you are not planning to modify the pointer 
// passed by reference 
void test(float * const &x){ 
    *x = 1000; 
} 

oder eine Variable deklarieren machen, zu dem Sie einen Zeiger auf nKByte zuweisen, bevor test Aufruf:

float nKByte = 100.0; 
// If "test()" decides to modify `x`, the modification will be reflected in nKBytePtr 
float *nKBytePtr = &nKByte; 
test(nKBytePtr); 
+0

Ihr Beispiel mit Erklärung ist genial, so verstehe ich es jetzt 'temporären Wert', auch Ihre Lösung' float * nKBytePtr = & nKByte; 'auch anders mit anderen Antworten, so muss ich (muss!) Ihre Lösung als Antwort wählen. Nochmals vielen Dank: D –

3

Wenn Sie test mit &nKByte nennen, schafft die Adressoperator einen temporären Wert, und Sie können in der Regel keine Verweise auf temporäre Werte haben, weil sie sind, na ja, vorübergehend.

Verwenden Sie keine Referenz für das Argument, oder besser noch keinen Zeiger.

+0

float nKByte = 100,0; float * ptr = & nKByte; Test (PTR); – thomas

+0

@thomas Ja, das würde funktionieren, aber in diesem Fall brauchen Sie keinen Verweis auf einen Zeiger. –

+0

danke für die Antworten, ich habe neue Sache gelernt, dass & nKByte einen temporären Wert erstellen und ich weiß es nicht bis jetzt .. und nochmals danke :) –

4

Die &nKByte erstellt einen temporären Wert, der nicht an einen Verweis auf non-const gebunden werden kann.

Sie könnten void test(float *&x) zu void test(float * const &x) ändern, oder Sie könnten den Zeiger zusammen fallen lassen und void test(float &x); /*...*/ test(nKByte); verwenden.

+0

danke für die schnellen Antworten, jetzt verstehe ich es :) –