2013-07-21 30 views
16

Tôi đang cố gắng để gửi giá trị vào chức năng sử dụng con trỏ tham khảo nhưng nó đã cho tôi một lỗi hoàn toàn xa lạ kiểu với tôiC++ giá trị ban đầu của tài liệu tham khảo để không const phải là một giá trị trái

#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(); 
} 

Lỗi: ban đầu giá trị của tham chiếu đến non-const phải là một lvalue

Tôi không biết mình phải làm gì để sửa mã trên, ai đó có thể cho tôi một số ý tưởng về cách sửa mã đó? thanks :)

+1

Bạn có thể chỉ cần thả con trỏ, sử dụng một tham chiếu đơn giản thay thế? –

+0

haha, bây giờ vì im theo hướng dẫn tại learncpp.com và trang web đó dạy tôi cách sử dụng con trỏ tham chiếu trong hàm, vì vậy tôi cũng muốn thử nó ..: p btw thanks @Micha Wiedenmann –

+0

Sử dụng tham chiếu đến con trỏ chỉ khi bạn muốn sửa đổi một con trỏ bên ngoài hàm. –

Trả lời

31

Khi bạn chuyển con trỏ theo tham chiếu không phải là const, bạn đang thông báo cho trình biên dịch biết rằng bạn sẽ sửa đổi giá trị của con trỏ đó. Mã của bạn không làm điều đó, nhưng trình biên dịch nghĩ rằng nó có, hoặc có kế hoạch để làm điều đó trong tương lai.

Để khắc phục lỗi này, hoặc tuyên bố x liên tục

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

hoặc thực hiện một biến mà bạn gán một con trỏ đến nKByte trước khi gọi test:

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

ví dụ của bạn giải thích là tuyệt vời, vì vậy tôi hiểu nó bây giờ 'giá trị tạm thời', cũng, giải pháp của bạn' float * nKBytePtr = & nKByte; 'cũng khác với câu trả lời khác, vì vậy tôi có (phải!) chọn giải pháp của bạn như một câu trả lời .. cảm ơn một lần nữa: D –

3

Khi bạn gọi test với &nKByte, địa chỉ-của nhà điều hành tạo ra một giá trị tạm thời , và bạn không thể thường có tham chiếu đến các giá trị tạm thời vì họ đang có, tốt, tạm thời.

Hoặc không sử dụng tham chiếu cho đối số hoặc tốt hơn nhưng không sử dụng con trỏ.

+0

float nKByte = 100.0; float * ptr = & nKByte; kiểm tra (ptr); – thomas

+0

@thomas Có điều đó sẽ làm việc, nhưng trong trường hợp này không cần phải sử dụng một tham chiếu đến một con trỏ. –

+0

cảm ơn cho câu trả lời, tôi đã học điều mới & nKByte tạo ra một giá trị tạm thời và tôi không biết nó cho đến bây giờ..và cảm ơn lần nữa :) –

4

&nKByte tạo giá trị tạm thời, không thể bị ràng buộc với tham chiếu đến không phải là const.

Bạn có thể thay đổi void test(float *&x) thành void test(float * const &x) hoặc bạn chỉ có thể thả con trỏ hoàn toàn và sử dụng void test(float &x); /*...*/ test(nKByte);.

+0

cảm ơn cho câu trả lời nhanh chóng, bây giờ tôi hiểu nó :) –

Các vấn đề liên quan