0

私は ac# 開発者で、c++ の学習/再学習/ブラッシュアップを行っています。

私はデータベースアクセスに取り組んでいます。次のコードがあり、この場合の & の動作を理解するのに苦労しています。

SQLHENV     hEnv = NULL;

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

& を削除すると、このエラーが発生します。

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

最初は、このフィールドを参照として渡すだけだと思っていましたが、エラーに基づいて、どのように変換できるようになっているように見えますか?

4

4 に答える 4

6

式で単項演算子として現れる場合&は、アドレス取得演算子です。表示しているコードは、へのポインターをhEnvに渡しますSQLAllocHandle()

良い C++ の本を手に取りたいと思うかもしれません。

于 2013-01-04T16:14:18.793 に答える
5

現在の例のコンテキストでは、&演算子は変数のアドレスを取得するために使用されます。

SQLAllocHandleエラーメッセージから、パラメータ3がタイプSQLHANDLE *(ポインタ)であることが期待されているように見えますSQLHANDLE

を「削除」すると&、に渡さSQLHENVれますが、必要なタイプに変換できませんでした。しかし、あなたが「インクルード」したとき&、それは私が推測しているのでうまくいきSQLHANDLEましtypedefSQLHENV、または継承または他の理由のためにSQLHENV*変換可能です。SQLHANDLE*

との署名とSQLAllocHandleクラス関係が質問に記載されていないため、当て推量を行う必要があります。SQLHENVSQLHANDLE

于 2013-01-04T16:22:35.510 に答える
0

&アドレス演算子です。ローカルの hEnv を取得し、そのアドレスを渡します。これで、型ではなく、参照している型へのポインターが得られました。

それで

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

アドレス演算子をスキップすると、型へのポインターではなく、型が残ります。

于 2013-01-04T16:13:55.317 に答える
-4

& は参照渡しを意味します。コンパイラは、参照から値型に変換できないと言っているだけです

EDIT:関数がADDRESS(ポインタ)を受け入れるとき、それは参照渡しと呼ばれます。私の答えが一部の人を混乱させて申し訳ありませんが、この場合、関数は変数への参照を期待しているため、その変数の ADDRESS を渡す必要があります。

于 2013-01-04T16:14:29.333 に答える