我读过函数指针的语法,但我不能在我的代码中使用.

This video解释说,语法是:

type func0(type0 arg0, ..., typen argn){
    // do something
    return a_thing;
}

则用于在另一个函数中传递函数指针的是:

type func1((*func0)(type0 arg0, ..., typen argn), another args){  
    //do something
    func0(arg0, ..., argn);    
    return a_thing;
}

但后来,我读到了第一个答案,大约是How do function pointers in C work?,语法是:

type func1((*func0)(type0 arg0, ..., typen argn), another args) {    
    //do something
    (*func0)(arg0, ..., argn);
    return a_thing;
}

这是有意义的,因为您正在取消引用您正在传递的指针.最后,C function pointers invocation syntax中的第一个答案解释语法可以是:

&func
func
*func
**func

我不知道哪个信息是正确的.我有代码:

double *func1((*func0)(double), double *var) {
    double *temp = malloc(some_size);
    for(int i = 0; i < some_cycles; ++i) {
        temp[i] = (*func0)(var[i]);
    }
    return temp;
}

它抛出错误a value of type "double *" cannot be assigned to an entity of type "double"

编辑:

对于任何想要查看真实代码的人来说,是这样的:

tensor_t *applyBinOpTensor(double *(operation)(double, double), tensor_t *tensor, double operand){

    size_t total_size = indiceProduct(*tensor->shape);
    double *values = malloc(total_size * sizeof(*values));

    for(size_t i = 0; i < total_size; ++i){
        values[i] = (*operation)(tensor->values[i], operand);
    }
    return initializeTensor(values, tensor->shape);
}

正如你所看到的,所有的问题都是我输入了double *(operation)(double, double)而不是double (*operation)(double, double).

感谢所有人的回答.我学到了很多,很抱歉我拼错了.

推荐答案

将函数指针传递给函数是相对容易的.

给定一些函数指针:

int (*fptr) (int, double);

只需将相同的语法添加到参数列表中:

void some_func (int some_param, int (*fptr)(int, double), int some_other_param);

当您try 返回函数指针时,它会变得更加令人困惑.让我们采用上面的函数,并将函数指针从参数列表移动到返回类型:

int (*some_func(int some_param, int some_other_param)) (int, double);

是的,一派胡言乱语……


那么我们到底能从中学到什么呢?

  • 无论是谁发明了C中的函数指针语法,他都感到困惑.
  • 编写上述代码的人会感到困惑.
  • 试图学习函数指针语法的人会感到困惑.
  • 如果你真的学会了语法,你已经在废话上花了way多个时间,这些时间本可以花在更好的事情上.

Always use typedef.个句号.

typedef int func_t (int, double);

void some_func (int some_param, func_t* fptr, int some_other_param);

func_t* some_func (int some_param, int some_other_param);

C++相关问答推荐

与unions 的未定义行为

在32位处理器上优化53—32位模计算>

如果实际的syscall是CLONE(),那么为什么strace接受fork()呢?

手动矢量化性能差异较大

我编译了一个新的c程序,并收到以下错误

编译的时候g++通常会比GCC慢很多吗?

如何在ASM中访问C struct 成员

为什么我会收到释放后堆使用错误?

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

如何在提取的索引中分配空值?

如何在C++中安全地进行浮点运算

有没有一种方法可以用C创建保留限定符的函数?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

发送和接收的消息中的Unix域套接字不匹配

UpDown控制与预期相反

无法在线程内用 C 打印?

C11 嵌套泛型