【问题标题】:when use "&" operator in function pointers?在函数指针中使用“&”运算符时?
【发布时间】:2017-04-11 23:48:17
【问题描述】:

在下面的代码中,我在main 中读取file.rec 并将其放入char buf。然后我传递了这个bufgetCallBack() 函数的函数指针,但我通过两种可用的方式传递函数。因此,该函数通常以这两种方式接收函数指针。所以我很想知道使用与不使用有什么区别。

#include<stdio.h>

void getCallBack(char buf[], void(*executeCallBack)(char[])){
    printf("callback recived\n");
    executeCallBack(buf);
}

void callBack(char buf[]){
    printf("executing callback...\n");
    printf("buf content: ");
    printf("%s\n", buf);
}

void main() {

    FILE *ReadingXmlFile = fopen("texto.rec", "r");
    char buf[10000];
    fread(buf, 1, 10000, ReadingXmlFile);
    fclose(ReadingXmlFile);

    printf("passing \"&callBack\"\n");
    getCallBack(buf, &callBack);

    printf("passing \"callBack\"\n");
    getCallBack(buf, callBack);
    //
}

【问题讨论】:

  • 函数自然衰减为指向自身的指针,类似于数组衰减为指向其第一个元素的指针。不过,我建议明确说明,并始终使用地址运算符&amp;

标签: c pointers function-pointers


【解决方案1】:

这纯粹是表面问题。在函数类型自身衰减为指针类型的上下文中(几乎无处不在),显式一元 &amp; 没有语义差异。选择对你来说更好看的东西。只要努力保持一致即可。


在通过指针调用函数时,使用显式* 运算符几乎是一样的。您可以将回调调用为executeCallBack(buf)(*executeCallBack)(buf)。两者是等价的。再次,选择你的风格并坚持下去。

可能有人会争辩说,为了对称,如果获取地址时使用&amp;,调用函数时应该使用*

【讨论】:

  • 所以sizeof callBack 不好,sizeof &amp;callBack 适合 other 上下文?
  • @chux:我不确定我是否理解这个问题。我上面所说的关于&amp; 的内容仅适用于其操作数是函数类型的上下文。如果callBack 本身是一个指针(不是函数),那么情况就不同了——&amp; 在这种情况下会产生巨大的影响。
【解决方案2】:

没有区别。 &amp; 是隐含的。

类似的方式是,如果你有一个数组someArray,那么可以使用someArray代替&amp;someArray[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2014-12-24
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多