【问题标题】:Function Pointer help/ Pointer from integer函数指针帮助/来自整数的指针
【发布时间】:2016-12-04 10:46:15
【问题描述】:

所以我正在做一个任务,我们需要将我们自己制作的函数传递给为我们提供的库。

Tree * createBinTree(int (*comparePointer) (TreeDataTypePtr data1,      
TreeDataTypePtr data2), void (*destroyPointer) (TreeDataTypePtr));

是我提供的代码。 我的 comparePointer 函数指针是

int(*compStr)(void *, void *) = &compareName;

比较是

int compareName(void * rest1, void * rest2);

但是当我像这样通过它时

Tree * myTree = createBinTree((compstr)(str1,str2),die(str1));

我只在 compstr 上得到一个错误,即“传递 createBinTree 的参数 1 使指针从整数而不进行强制转换”和“预期的 'int (*)(void *, void *) 但参数是 int 类型。

【问题讨论】:

  • 因为只需要传递函数名:Tree * myTree = createBinTree(compstr, die);
  • 这行得通,但我现在不确定如何使用变量
  • 此 API 的重点是,您不应该调用这些函数。
  • 现在更有意义了,谢谢!

标签: c pointers binary-tree function-pointers


【解决方案1】:

你需要传递函数,而不是调用函数并传递返回值:

Tree* myTree = createBinTree( compstr , die );

但这仍然不正确。 compstrdie的类型必须与函数createBinTree的参数类型兼容:

int(*compStr)( TreeDataTypePtr , TreeDataTypePtr ) = &compareName;

在这种情况下,compareName 必须是同一类型的函数。 die 也是如此。


请注意,只有将函数指针转换为兼容类型才会在用于调用函数时导致未定义的行为。函数指针的原始类型必须与用于调用函数的类型兼容。这将导致未定义的行为

int(*compStr)(void *, void *) = &compareName;
Tree* myTree = createBinTree( ( int(*)(TreeDataTypePtr,TreeDataTypePtr ) )compstr , die );

【讨论】:

  • 那么我应该如何使用这些值?
  • @Bipop 我不明白这个问题。 TreeDataTypePtr 不是已经定义了吗?
  • compstr 和 die 是兼容的,但这是我第一次使用函数指针,所以我真的不明白传递函数如何实现很多。 TreeDataTypePtr 定义在这一行 typedef void * TreeDataTypePtr
  • @Bipop 这取决于您没有提供的TreeDataTypePtr 的类型。通常你会投射指针。这当然会失去类型安全性。
  • 好吧,我想我明白了。很抱歉造成混乱,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多