2013-10-30 149 views
-5

下面的代碼:奇怪的編譯錯誤的功能

#include <iostream> 
using namespace std; 
void mysize(int &size, int size2); 
int main() 
{ 
    int *p; 
    int val; 
    p = &val; 
    cout << p; 
    mysize(&val, 20); // Error is pointed here! 
} 

void mysize(int &size, int size2) 
{ 
    cout << sizeof(size); 
    size2 = size2 + 6000; 
    cout << size2; 
} 

這裏的錯誤輸出從GCC:

In function 'int main()': Line 10: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int*' compilation terminated due to -Wfatal-errors.

是什麼暗示?我不明白錯誤消息...一個非常量的無效初始化?我使用兩個參數來聲明上面的原型函數,其中一個是整數引用,另一個是整數值本身。我通過了int的引用(見第10行),但是這個錯誤一直在引發我。另外,它如何「暫時成爲一個指針」?

問題是什麼?

+0

所以,函數需要一個*引用*爲整數參數,就像你自己說的那樣。那麼爲什麼你試圖將一個*指針*傳遞給它的整數參數呢?參考文獻和指針不相同,不可互換。 – AnT

+0

我正在傳遞_&val_,它是**引用**。 –

+2

你堅持一個指針是一個引用不會改變C++語言。 – juanchopanza

回答

1

您正在將一個整數的地址傳遞給mysize,它需要一個整數參數通過引用傳遞。通話改成這樣:

mysize(val, 20); //remove & 
+0

我試過了,我得到這個錯誤:在函數'int main()'中: 第7行:錯誤:'val'聲明爲引用,但未初始化 編譯由於-Wfatal-errors而終止。 –

+0

不需要,如果函數需要一個指針 –

+0

不需要,當您使用引用時,只需傳遞變量名稱即可。 – Kunal

3

valint&valval地址,這是一個指向int。你的函數需要一個引用。你需要調用它

mysize(val, 20); 

和簽名更改爲

void mysize(const int &size, int size2); 

,或者甚至更好,

void mysize(int size, int size2); 

,因爲你沒有修改size

+0

你在說什麼? &val是一個引用,我將&val傳遞給void函數前面的第一個參數。 –

+5

@GrewdrewgooGoobergabbsoen *你在說什麼? '&val'是一個指向'int'的指針。 – juanchopanza

+0

我通過了參考。 &val是一個參考。 * val是一個指針。 –

0

指針和引用之間有區別。對於參考文獻,想象一下,編譯器會爲您「採取地址」和「取消引用」,您不必(也不能)手動執行。另外,請注意& - 操作員的不同含義。一些例子:

int a = 5; 
int *pa = &a; // take address of a, store it in pa 
int &ra = a; // define ra as a reference to a 

// Function taking reference to long and pointer to int 
void foo(long& a, int* b); 

// Call it like this: 
long myLong = 100; 
int myInt = 10; 
foo(myLong, &myInt);  

所以對於一個參考,你並不需要使用地址操作&(它的完成隱含),而你需要它的指針。