2017-04-11 24 views
0

在下面的代码中,我正在读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); 
    // 
} 
+1

一个函数自然衰减到自己的指针,类似于数组如何衰减到指向其第一个元素的指针。我建议尽可能明确地说明它,并且总是使用操作符'&'的地址。 –

回答

3

没有区别。隐含&

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

4

这是一个纯粹的美容问题。在函数类型自身衰减为指针类型的环境中(几乎处处都是),明确的一元文件&没有语义上的差异。选择你看起来更好的东西。只要努力保持一致。


几乎同样的道理也适用于调用通过指针的函数时,使用显式*运营商。您可以调用您的回拨为executeCallBack(buf)(*executeCallBack)(buf)。这两个是相同的。再次,选择你的风格并坚持下去。

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

+0

所以'sizeof callBack'是坏的,'sizeof&callBack'对于_other_上下文是好的吗? – chux

+0

@chux:我不确定我是否理解这个问题。我上面所说的关于'&&&'只适用于其操作数是函数类型的上下文。如果'callBack'本身是一个指针(不是函数),那么它就是一个不同的故事 - 在这种情况下'&'会产生巨大的差异。 – AnT