【问题标题】:Name of a function used as a pointer用作指针的函数名
【发布时间】:2020-06-19 10:43:56
【问题描述】:

我有这个功能:

void *task();

名称任务在另一个函数中用作参数:

pthread_create(..., task, ...);

这是一种特殊情况,还是函数名包含其地址这一事实总是正确的?

上面pthread_create的参数应该是一个指针:

void *(*start_routine)(void*)

编辑:

void *task()
{
    printf("I am a simple thread.\n");
}

感谢您的宝贵时间。

【问题讨论】:

  • 请注意,您的 task() 函数类型不适合用作线程启动函数。它需要接受一个void * 类型的参数,即使它不做任何事情。

标签: c function pointers pthreads


【解决方案1】:

没有特殊情况 - 相反!函数名几乎总是衰减为指向函数的指针。唯一的例外是当它是&的操作数时,即&task,它不会衰减为函数指针,但& 将函数指示符转换为指针,因此,如果task 指定了一个函数(即它不是一个指针),pthread_create(..., task, ...);pthread_create(..., &task, ...); 将同样工作。


事实上,函数调用操作符只能应用于函数指针:

printf("Hello world");

获取函数指示符printf将其转换为指向函数的指针,然后调用此指针指向的函数并为其提供参数"Hello world"


还要注意,void *task(); 对 pthread 函数的声明有些不正确,它应该是 void *task(void *);

【讨论】:

  • 函数调用是函数调用。与指针没有任何共同之处。同int a; a =5;一样需要知道a的地址才能保存不代表赋值中的a是指针之类的东西。
  • @P__J__ 无论如何,这就是标准所说的。
  • 标准说当你调用它时使用指向函数的指针。在哪里?
  • 非常感谢您的回答@AnttiHaapala
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2018-02-05
相关资源
最近更新 更多