2013-12-09 128 views
0

我希望有人能向我解釋爲什麼與基準參數的函數會被調用,而不是一個帶有指針參數調用funcs中,給出類似如下:與指針PARAMS VS參考PARAMS

int Func1 (int & a); 
int Func1 (int * a); 

int main() 
{ 
    int y = 1; 
    int & x = y; 
    int * z = & y; 

    Func1(y); // Calls reference version 
    Func1(&y); // Calls pointer version 
    Func1(z); // Calls pointer version 

    return 0; 
} 

int Func1 (int & a) 
{ 
    cout << "Reference param Func1 called" << endl; 
    a = a + 1; 

    return a + 1; 
} 

int Func1 (int * a) 
{ 
    cout << "Pointer param Func1 called" << endl; 
    *a = *a + 1; 

    return *a + 1; 
} 

我很困惑,決定如何調用Func1(& y)調用的Func1的指針參數版本,而不是參考版本的Func1。另外,爲什麼Func1的參考參數版本不是爲Func1(z)調用選擇的?如果z保存一個地址,我不明白爲什麼地址不能傳遞給Func1的參考參數(& a)。

+0

它關於類型,z的類型是一個指針。 –

+0

啊,我明白了。因此,Func1(int&a)創建一個引用,它不會接收地址作爲傳遞的參數,而Func1(int * a)接收地址作爲傳遞的參數,其形式可以是&y或z,其中z是一個指針? –

+0

@Caulibrot:'&y' *是一個指針。所以這是「z,其中z是指針」的例子。 –

回答

1

int Func1 (int & a);匹配調用表達式的類型爲int(並且有資格接受非常量引用)的調用。 int Func1 (int * a);匹配調用表達式的類型爲int*的調用。

如果z保存一個地址,我不明白爲什麼地址不能傳遞給Func1的參考參數(& a)。

那麼,你可以通過調用Func1(*z)來實現。