【问题标题】:int (*d)(int *) = foo, what does this part of the code do?int (*d)(int *) = foo,这部分代码是做什么的?
【发布时间】:2022-01-08 21:42:12
【问题描述】:
int foo (int x) {
    int (*d)(int *) = foo;  //what is the meaning of this line?
    ...
}

这是我学校的一个老练习题,但我找不到解决方案。 是把变量初始化为函数吗?

【问题讨论】:

  • d 是一个指向函数的指针,该函数接受一个 int * 参数并返回 int。它被分配了 foo 的地址。这应该会发出警告。
  • 表示函数指针类型的语法有点令人困惑。最令人困惑的部分是变量的名称(d)不跟类型,而是嵌入其中。
  • 如果是您学校的问题,您或他们都错过了课程中的某些内容。
  • cdecl 非常适合。
  • 认为foo的函数指针类型为int (*)(int)int (*d)(int) 只是将其命名为 d

标签: c initialization function-pointers declaration implicit-conversion


【解决方案1】:

这条记录

int (*d)(int *) = foo; 

是函数指针d 的声明,指向具有返回类型int 和一个int * 类型参数的函数。此指针由函数foo 的地址初始化(函数指示符隐式转换为指向它的指针)。

注意函数foo应该声明为

int foo (int *x) {

或者指针应该被声明为

int (*d)(int ) = foo; 

否则在此声明中

int (*d)(int *) = foo; 

使用了不兼容的指针类型。

【讨论】:

    【解决方案2】:

    据我所知,a 声明与您的问题无关。 int (*d)(int *) 定义了一个指针 d 指向一个函数,该函数接受一个 int * 并返回一个 int= foo 设置d 等于foo 的地址。

    【讨论】:

    • (由于原型不匹配而具有未定义的行为。)
    • @Neil "具有未定义的行为,因为原型不匹配" --> C 规范具有 "指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针再返回;结果应与原始指针比较。如果转换后的指针用于调用类型与引用类型不兼容的函数,则行为未定义。”。在我看来,分配是不是 UB。呼叫d() 是UB。
    • @user17732522 您是否建议正确转换初始化是可以的,但 OP 是 UB?
    • @chux-ReinstateMonica 这是一个很好的区别。
    • @chux-ReinstateMonica 实际上不,就标准而言,从技术上讲,我猜是这样(stackoverflow.com/questions/36828742/…)使用-pedantic-errors,编译器不会编译代码,但我会删除我的评论。在这样的问题上,我不应该是语言律师。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2015-06-17
    • 2011-07-26
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多