【问题标题】:Calling a function with indirect operator使用间接运算符调用函数
【发布时间】:2016-01-05 02:01:38
【问题描述】:

我有两个使用间接运算符 * 的函数,需要从第一个函数调用第二个函数并将给定的参数传递给第一个函数,并且怀疑我是否必须使用 *& 到传递缓冲区地址。

char Func1(short Enable, char Event, char *BufferX)
{
    char xResult;

    xResult=Func2(Event, ?BufferX);//* or &
    return xResult;
}

char Func2(char Event, char *BufferX)
{

}

微控制器的代码是 C,而不是标准 C。

【问题讨论】:

  • 鉴于这些函数定义,您不必使用&*,只需传递BufferX
  • char *BufferX 这里是一个指向 char 的指针,通常表示一个以空字符结尾的 C 字符串。
  • 微控制器也像分号!
  • 其实*叫做dereference operator,而&address (of) operator
  • @wildplasser 我知道,但是当我意识到我的错误为时已晚,为了进行编辑,我必须更改至少 6 个字符。

标签: c function indirection


【解决方案1】:

我有两个函数使用间接运算符*

星号* 可以解释为表达式上下文中的取消引用运算符。在声明的上下文中,它用于指示所声明的类型是一个指针。

[I]需要从第一个函数调用第二个函数,并将给定的参数传递给第一个函数

由于这两种类型是相同的,所以你根本不需要使用任何运算符:只需不变地传递指针的值,如下所示:

xResult=Func2(Event, BufferX);

注意:不言而喻,您需要 Func2 的前向声明才能正确解释此调用。

【讨论】:

  • 你说的是原型吗?是的,这部分我很清楚。
  • @E_Blue 是的,这正是我要说的。前向声明和原型是一回事。
【解决方案2】:

正确的调用是:

xResult=Func2(Event, /*nothing here*/BufferX);

由于您的 BufferX 已经是正确的数据类型,您不必取消引用或获取它的地址。

【讨论】:

    【解决方案3】:

    Func2 需要char* 类型的参数。 BufferX 的类型已经是char*

    因此您可以直接将BufferX 传递给Func2

    xResult = Func2(Event, BufferX);
    

    &BufferX 会给你BufferX 的地址,类型为char**,而*BufferX 会给你BufferX 指向的东西,即char

    【讨论】:

    • 您是尝试写 char* 来代替 char** 还是有我不知道的 char** 类型?
    • @E_Blue 不,我的意思是char**type* 中的 * 表示“指向”的指针,因此 char* = 指向 char 的指针,char** = 指向 char* 的指针。
    • 指针感知。以前从未读过它。有什么词可以推荐我进行搜索吗?
    • 嗯,指向指针的指针没什么特别的,尤其是在 C 中。毕竟,指针是基本变量,就像 int 一样。然后你有一个指向那个变量的指针。
    【解决方案4】:

    您提供的代码不是使用间接运算符,它使用的是指针类型。具有指针类型的值是唯一可以作为间接运算符的操作数的类型,但这是另一回事。

    具体来说,函数Func1() 的参数BufferX 的类型为char *,这使它成为一个指向char 的指针(大概它指向一个更长的第一个 char缓冲区)。

    参数BufferXFunc2() 也有类型char *。如果将参数从Func1() 传递到Func2() 是合适的,那么您不需要任何装饰——您只需传递收到的值:

    xResult = Func2(Event, BufferX);
    

    【讨论】:

      【解决方案5】:

      var 成为一个指针..

      *var 表示指针所指的值..

      &var表示变量var的地址(不管是指针)

      所以在这种情况下,您只需要传递变量。

      xResult=Func2(Event, BufferX);
      

      这是因为 Func2 在其第二个参数中要求一个指针。 (不是值,不是指针的地址..)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-02
        • 2011-06-09
        • 2018-06-07
        • 2013-10-31
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2017-12-14
        相关资源
        最近更新 更多