C函数指针既不是函数也不是指针

时间:2017-08-20 03:41:19

标签: c arrays pointers

在我继续之前,我发现的最接近的问题是:subscripted value is neither array nor pointer function error但解决方案尚未适用于我的。

我有一个C函数,其目标是接受一个浮点数组和一个函数数组,将每个函数应用于float数组中相同索引的值,将值保存在作为参数传入的数组中。

我对语法非常小心,并为函数指针定义了一个类型:

typedef float (*func_ptr)(float);

(如果有人愿意解释我的评论或解决方案,为什么语法不是(不起作用)typedef float (*)(float) func_ptr,也会受到赞赏)

这个函数(我认为最接近于函数)然后看起来像:

void Vector_Function(void * _F, float v[], size_t size, float ret[]){
  func_ptr (*F)[size]=_F; //trying to cast to pointer to array of function pointers
  float (*F)[size]=_F;
  for(size_t i=0; i<size; i++){
    ret[i]=F[i](v[i]);
  }
}

错误是:

> error: called object is not a function or function pointer
>      ret[i]=F[i](v[i]);
>             ^

真正让我感到的是typedef似乎如此公然地使F[i]成为一个函数指针......

我尝试过的其他事情是:

void Vector_Function(void * _F, float v[], size_t size, float ret[]){
  float (*F[size])(float)=_F;
  for(size_t i=0; i<size; i++){
     ret[i]=F[i](v[i]);
  }
}

void Vector_Function(float (*F)[size], float v[], size_t size, float ret[]){
//just wrong
  for(size_t i=0; i<size; i++){
    ret[i]=F[i](v[i]);
  }
}

2 个答案:

答案 0 :(得分:3)

进行演员表时,您不需要包含size。如果void*用于表示函数指针数组,则可以像这样强制转换为数组:

void Vector_Function(void * _F, float v[], size_t size, float ret[]){
  func_ptr *funcs = (func_ptr*)(_F);
  for(size_t i=0; i<size; i++){
    func_ptr F = funcs[i];
    ret[i]=F(v[i]);
  }
}

您不需要任何关于数组中要执行转换的事物的指示,因为数组指针只包含对数组开头的引用,并且没有关于数组的信息。尺寸附在它上面。这要求您的_F具有特定格式,那么为什么不使用func_ptr*代替void*

答案 1 :(得分:1)

你可以这样想让你更好地理解,

1 float f(float x)。: 这是一个带有arg f()的函数x,函数的名称是一个地址/指针,所以f应该是一个指针,所以你可以定义一个如下所示的函数指针:{ {1}},就像其他指针一样,您可以初始为float (*f_x)(float x)

2 f_x = f。: 这非常简单,只需将typedef int INT_TYPE类型重命名为int

即可

基于以上所述,INT_TYPE - &gt; float (*f_x)(float x)。最后,您应该始终记住:typedef float (*F_X_TYPE)(float x)的优先级高于()