2013-01-04 44 views
0

的我是一個C#開發人員學習/再學習/對C++新的C++ - &符號盈參數

我的工作,我有以下的代碼和IM遇到麻煩的數據庫訪問刷牙瞭解&做什麼在這種情況下。

SQLHENV  hEnv = NULL; 

if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) 
    { 

如果我刪除&我得到這個錯誤。

'SQLAllocHandle' : cannot convert parameter 3 from 'SQLHENV' to 'SQLHANDLE *' 

起初我還以爲是隻是傳遞這個領域中作爲參考,但基於它讀起來更像是它的錯誤是一些如何使其轉換?

+1

爲什麼要刪除地址運算符'&'?該函數需要一個指向SQLHENV的指針。 – harper

+0

我不是我只是試圖從錯誤中學習爲什麼它在那裏。 –

+0

不要猶豫,按照你所做的順序寫下你已經完成的步驟。這可以幫助更好地理解問題。 – harper

回答

5

在當前的實施例的上下文中,操作者&被用來獲得一個變量的地址。

從錯誤消息,它看起來像SQLAllocHandle預計參數3爲SQLHANDLE *類型(指針SQLHANDLE)的。

當您「移除」&時,您向其傳遞了一個SQLHENV,它無法轉換爲所需的類型。但是當你「包含」&時,它的工作原理是因爲我猜SQLHANDLEtypedef編輯爲SQLHENV,或者SQLHENV*由於繼承或其他原因可以轉換爲SQLHANDLE*

我需要做猜測,因爲SQLAllocHandle的簽名和SQLHENVSQLHANDLE的類關係在問題中沒有提到。

+0

謝謝,非常詳細! –

+0

@PaulWade歡迎您。一旦你有15的聲望,請做好它。 :) –

0

&是地址運算符。它採用本地hEnv並傳遞它的地址。現在你沒有這個類型,而是一個指向你所指類型的指針。

所以

void foo() 
{ 
    int i = 1; 
    int * iptr = &i; 
} 

當你跳過你仍然有類型,而不是指針類型的地址運算符。

6

在表達式中作爲一元運算符出現時,&是地址運算符。您顯示的代碼將hEnv的指針傳遞給SQLAllocHandle()

您可能想要拿起good C++ book

-4

&的意思是通過引用。編譯器只是告訴你它不能從引用轉換爲值類型

編輯:當一個函數接受一個ADDRESS(指針)時,它被稱爲通過引用傳遞。如果我的答案讓某些人感到困惑,我很抱歉,但在這種情況下,您的函數期望引用一個變量,因此您需要將該變量的地址傳遞給它。

+1

-1:在這種情況下,它不是通過引用傳遞,而是取地址。 – Angew

+1

'typename&'可能是一個引用,但'&variable'正在取一個地址。 – Chowlett

+0

-1答案只是錯誤 – Walter