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

在表达式中作为一元运算符出现时,&是地址运算符。您显示的代码将指针传递给hEnvinto SQLAllocHandle()

您可能想选择一本好的 C++ 书籍

于 2013-01-04T16:14:18.793 回答
5

在您当前示例的上下文中,&运算符用于获取变量的地址。

从错误消息中,看起来SQLAllocHandle参数 3 是类型SQLHANDLE *(指向 的指针SQLHANDLE)。

当您“删除” 时&,您将 a 传递SQLHENV给它,它无法转换为所需的类型。但是,当您确实“包含” the&时,它​​起作用了,因为我猜SQLHANDLEtypedefed to SQLHENV,或者 a由于继承或其他原因SQLHENV*可转换为。SQLHANDLE*

我需要做猜测,因为问题中没有提到and的签名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

& 确实意味着通过引用传递。编译器只是告诉你它不能从引用转换为值类型

编辑:当一个函数接受一个地址(指针)时,它被称为按引用传递。如果我的回答让某些人感到困惑,我很抱歉,但在这种情况下,您的函数期望一个变量的引用,因此您需要将该变量的地址传递给它。

于 2013-01-04T16:14:29.333 回答