【问题标题】:Function parameter with asterisk and ampersand带星号和 & 符号的函数参数
【发布时间】:2014-09-27 19:28:50
【问题描述】:

我在这里有一个函数正在工作,我正在努力解决它。

谁能解释这段代码在做什么?

unsigned int Function( BYTE *&, BYTE );

我从未见过带有*& 的参数。它用于多种功能。我试过在书中寻找答案并在网上寻找。我找不到有关此格式及其用途的任何信息。

如有任何帮助,我将不胜感激。

现在我看到了使用*& 的函数,但从来没有像上面那样一起使用。

另外,我知道返回值是无符号的int。 :)

我主要只是询问一个参数。

谢谢

【问题讨论】:

  • 通过引用传入指向字节的指针,并按值传入第二个输入字节。
  • 你能给我举个例子吗?
  • 表示Function不仅可以修改第一个参数指向的内容,还可以修改指向的地址。
  • 附带说明,应该从这个问题中删除“c”标签。

标签: c++


【解决方案1】:

在声明中

unsigned int Function( BYTE *&, BYTE );

*& 代表通过引用传递指针,这意味着在此函数内对指针所做的更改将针对原始指针而不是其副本。如果您需要修改指针而不是指针指向的对象,您可能希望通过引用传递指针。

@FredOverflow 的example 如下:

template< typename T>    
void paranoid_delete( T *&p)
{
    delete p;
    p = nullptr;
}

您还可以通过指针传递一个指针,如下所示:

void freeAndZero( void** ptr)
{
    free( *ptr);
    *ptr = 0;
}

如果没有引用,您只会更改指针的本地副本,不会影响调用者。

【讨论】:

  • 还有其他方法可以做同样的事情吗?比如声明 **ptr 并将其作为 &ptr 传递?
  • @Pepsi_1 是的,正如你所说,添加了解释
  • 那么程序员是否使用这种 * & 语法,这样他就不必在检查指针中的不同字符(如 %、' '、'*' 等)时尊重函数内部的指针?我仍在努力思考为什么有人要这样做。
  • @Pepsi_1 是的,可能是这种情况,但要完全回答您的问题,您必须粘贴 Function() 代码
【解决方案2】:

将简单的事物组合成复杂的系统可能是编程中最重要的概念。让我们分解这里发生的事情。

您知道,如果您看到BYTE*,则该类型是“指向 BYTE 的指针”。

现在,如果您看到 T&amp;,您就知道这是“对 T 的引用”。

当这些组合在一起时,使T 等于BYTE*,你得到(BYTE*)&amp;。由于语法分组规则,BYTE*&amp; 的含义相同。意思仍然是“对某物的引用……而某物是指向 BYTE 的指针”。

(注意语法分组规则很重要...const TBYTE*T写成const (BYTE*)BYTE* const,但与const BYTE*不一样)

【讨论】:

    【解决方案3】:
    unsigned int Function( BYTE *&, BYTE );
    

    第一个参数的类型是“引用指向BYTE 的指针”。从右到左阅读,会更容易理解。

    BYTE * &
    ^    ^ ^
    |    | |------ Reference to  
    |    |------- Pointer to
    |----------- BYTE (duh).
    

    您也可以使用 cdecl 并将 BYTE 替换为 charFunction 声明中的任何字母:

    将 f 声明为函数(对指向 char、char 的指针的引用)返回 未签名

    【讨论】:

      【解决方案4】:

      从右到左解析参数表达式:BYTE * &amp; 是对BYTE * 的引用。从右到左的解析通常对指针和引用很有用。

      【讨论】:

        【解决方案5】:

        无论第一个参数是BYTE *,还是BYTE * &amp;,你仍然传递一个BYTE *类型的指针作为调用者的第一个参数。

        第一个参数中的和号允许 Function 函数更改指针所指的地址。从调用函数的角度来看,对第一个参数的任何修改都会改变第一个参数的地址。

        如果第一个参数的类型是 BYTE* 而不是 BYTE *&amp;,则该参数也将是存储 BYTE 的地址。

        unsigned int Function( BYTE *&, BYTE );
        

        这个函数可以如下调用:

        int main(int argc, char *argv[]) {
            BYTE  b;
            BYTE* ptrToByte;
            unsigned int FunctionResult;
            b = 22;
            ptrToByte = &b;
            FunctionResult = Function(ptrToByte, b);
        
            /* At this point, ptrToByte may or may not have */
            /* changed, depending on what lines of code the Function function */
            /* executed */
        }
        


        其他说明
        • C 语言不支持通过引用传递参数;此函数原型对 C++ 有效,但对 C 无效。
        • 将每个参数的名称(不仅仅是数据类型)放在函数原型中被认为是一个好主意:

          Put name of parameters in C function prototypes?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-30
          • 2012-12-28
          • 2012-12-27
          • 2021-09-21
          相关资源
          最近更新 更多