【问题标题】:Which of the following function invocations is valid? [closed]以下哪个函数调用是有效的? [关闭]
【发布时间】:2017-02-10 17:11:52
【问题描述】:

考虑声明

char first (int (*) (char, float)) ;

int second(char, float);

以下哪些函数调用是有效的?

A)first (*second);

B)first (&second);

C)first (second);

D) 以上都不是

谁能解释一下这段代码?

【问题讨论】:

  • 另一个作业问题是什么?然后我们都可以去酒吧
  • 为什么不问问你的编译器
  • 选项 E — A、B 和 C 都有效。
  • 但是我必须说,在我尝试之前我不知道答案是 E。我很惊讶地看到 C 玩得又快又松。所以我赞成这个问题

标签: c function declaration


【解决方案1】:

三个调用都有效。

根据 C 标准(6.3.2.1 左值、数组和函数指示符)

4 函数指示符是具有函数类型的表达式。 除非它是 sizeof operator65) 的操作数或一元 & 运算符,类型为“函数返回类型”的函数指示符 转换为具有“函数指针”类型的表达式 返回类型''

你甚至可以写

first( ******second );

这是在表达式中使用的函数指示符被隐式转换为指向函数本身的指针,但实际上有一种情况是,它被用作 & 运算符的操作数,其中函数的地址显式采用。

这是一个演示程序

#include <stdio.h>

void g( void ( *f )( void ))
{
    f();
}


void f( void )
{
    puts( "Hello!" );
}

int main( void ) 
{
    g( **********f );

    return 0;
}

它的输出是

Hello!

考虑到函数first也可以声明为

char first (int (char, float)) ;

具有函数类型的函数参数被隐式调整为指向函数的指针。

【讨论】:

  • 所以f 表示&amp;f*f 表示&amp;f,当然&amp;f 表示&amp;f
  • @pm100 是的,你是对的。
  • 弗拉德,这是(标准)一种礼貌的说法“指针摆弄函数将被忽略”吗?
  • @PaulOgilvie 很抱歉我没明白你的意思。
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 2012-07-14
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多