函数指针的显式解引用在C中

时间:2013-06-26 10:35:48

标签: c function-pointers

我有一段代码,它是函数指针的一个例子,取自Linux内核源代码.Below是具有回调函数作为其成员的结构

 struct parport_driver {
 const char *name;
 void (*attach) (struct parport *);
 struct parport_driver *next;
 };

现在这些结构的成员在C文件中调用,如下所示

 struct parport_driver *drv;

 drv->attach(port); /* calling function through implicit dereference */

上面的函数是以隐式方式调用的,但我想知道它将如何被称为显式方式。

解除引用函数指针的隐式和显式方式有什么区别。

我想知道结构成员附加的另一件事应该在调用之前初始化(drv-> attach(port));

喜欢

DRV->附= attach_driver_chain;

其中attach_driver_chain是函数但我在驱动程序代码中找不到任何这样的初始化。

3 个答案:

答案 0 :(得分:7)

后缀()运算符(函数调用)被定义为获取指向函数的指针并调用该函数。所以它是指针的显式解除引用。没有其他方法可以调用函数。

虽然(*FunctionPointer)()看起来像是一个显式的解除引用,但表达式*FunctionPointer的类型是一个函数。根据C 2011 6.3.2.1 4,函数类型的表达式被转换为指向函数的指针(表达式是sizeof_Alignof&的操作数时除外)。因此,在(*FunctionPointer)()中,*FunctionPointer被转换为与FunctionPointer相同,并且没有完成任何操作:表达式与之前相同,()运算符作用于函数指针,而不是函数。

使用FunctionPointer()调用函数并使用(*FunctionPointer)()调用函数没有区别。你甚至可以用相同的效果写(***************FunctionPointer)()。每个*运算符都将被自动转换无效。

答案 1 :(得分:4)

  

上面的函数是以隐式方式调用的,但想知道它是如何被称为显式方式。

像这样:

(*(drv->attach))(port); // Not very pretty, huh?
  

解除引用函数指针的隐式和显式方式有什么区别

没有区别:因为你可以用函数指针做的就是调用它所指向的函数,编译器会忽略函数指针的显式解引用。

答案 2 :(得分:-1)

此示例也可能有所帮助

std::set<int> tmpSet;
tmpSet.insert(col);
result = sparseBlue.insert(std::make_pair(row, tmpSet));