我是c#开发人员学习/重新学习/刷新c ++
我正在进行数据库访问我有以下代码,我很难理解&在这种情况下。
SQLHENV hEnv = NULL;
if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR)
{
如果我删除&我收到了这个错误。
'SQLAllocHandle' : cannot convert parameter 3 from 'SQLHENV' to 'SQLHANDLE *'
起初我以为它只是将这个字段作为参考传递但是根据它读取的错误更像是一些如何允许它转换?
答案 0 :(得分:6)
在表达式中作为一元运算符出现时,&
是地址运算符。您展示的代码会将指向hEnv
的指针传递给SQLAllocHandle()
。
您可能想要选择good C++ book。
答案 1 :(得分:5)
在当前示例的上下文中,&
运算符用于获取变量的地址。
从错误消息中看起来SQLAllocHandle
期望参数3的类型为SQLHANDLE *
(指向SQLHANDLE
的指针)。
当您“删除”&
时,您向其传递了SQLHENV
,无法将其转换为所需类型。但是,当您“包含”&
时,它有效,因为我猜SQLHANDLE
typedef
为SQLHENV
,或SQLHENV*
可转换为{ {1}}由于继承或其他原因。
我需要做猜测,因为问题中未提及SQLHANDLE*
的签名以及SQLAllocHandle
和SQLHENV
的类关系。
答案 2 :(得分:0)
&
是地址运算符。它正在使用本地hEnv并传递它的地址。现在你没有类型,只有指向你所引用类型的指针。
所以
void foo()
{
int i = 1;
int * iptr = &i;
}
当你跳过地址操作符时,你仍然有类型,而不是指向类型的指针。
答案 3 :(得分:-4)
&安培;是指通过引用传递。编译器只是告诉你它无法从引用转换为值类型
编辑:当函数接受ADDRESS(指针)时,它被称为按引用传递。如果我的回答让某些人感到困惑,我很抱歉,但在这种情况下,你的函数期望参考变量,所以你需要传递该变量的ADDRESS。