【问题标题】:Function Pointers Error In C [duplicate]C中的函数指针错误[重复]
【发布时间】:2013-07-14 18:19:32
【问题描述】:

在一本书中,我遇到了以下问题。 我面临的问题是,什么是函数指针?它是如何工作的,它的声明语法是什么。

指出给定代码中的错误。

main()
{
    int (*p)()=fun;
    (*p)();
}
fun()
{
    printf("Hi..");
}

我的第一个问题是,下面的代码片段意味着什么?

int (*p)()=fun;
(*p)();

第二个明显的问题是给定代码中的错误是什么......??

解决方案参考ionela.voinescu的回答..和解决方案手册里写的一样..thnx

【问题讨论】:

  • 几乎所有的代码都不正确。
  • 你为什么要用 C++ 标记你明确的 C 相关问题
  • 阅读this answer
  • 这本书有多久了?
  • @Armin -- 隐式 int 已被弃用,现在被视为错误。除了 fun() 不返回任何东西。

标签: c function pointers


【解决方案1】:

fun 是函数本身的名称。

int (*p)()

是函数指针的定义,就像'int a'是整数的定义。

int * 是指针本身,() 表示它是指向函数的指针。

(*p)();

这是函数指针p的函数的执行,即p赋值给函数fun,函数fun是通过调用指针p的内容来执行的,因此是(*p)();

【讨论】:

  • -thnx 为您提供帮助.. 如果有 ryt 概念,请向我保证.. int(*p)();是函数指针的声明.. 通过编写 int(*p)()=fun .. 我们将函数定义的第一个语句的地址分配给指针 p.. 在下一个语句 (*p)() 我们是使用函数指针 p 存储的函数定义的第一个 statmnet 的地址执行函数...请告诉我..如果我是正确的..这就是你想解释给我的......???跨度>
  • @DD24 我不认为函数指针会指向函数的第一个语句。这个链接可以在一定程度上帮助你stackoverflow.com/questions/597292/…。如果您找不到任何具体的解决方案,您可以将其作为单独的问题发布。
  • Michel -thnx bro .. 该链接很有帮助...thnx 很多
  • @DD24:是的,你没看错。然而,第一个语句指针或多或少与函数的“入口点”相同。
【解决方案2】:

int (*p)() = fun 声明一个指向返回int 的函数的指针,然后将函数fun 的地址分配给该指针。 (*p)() 调用 p 指向的任何函数。

您的代码有问题:

  1. funmain 应该有一个返回类型。您的编译器可能不会要求它并假设它们返回 ints,但您仍然应该给它们一个。

  2. 你需要在main上方声明fun,或者使用prototype

另外,(*p)() 是不必要的;你可以使用p()

顺便说一句,由于函数指针语法相对丑陋,所以很常见的类型定义如

typedef int(*IntFunc)();

这将允许您像这样声明和使用p

IntFunc p = fun;
p();

【讨论】:

  • 在 C 标准中,没有参数由 (void) 表示,() 表示未指定参数的数量。
  • @linkdd 感谢您的更正。当 C++ 开发人员回答 C 问题时,就会发生这种情况。
  • @slavik262 NP,另一个更正:在旧的 K&R 中,没有返回类型的函数被视为返回 int。
  • thnx 很多.. 这很有帮助,而且很容易理解..
【解决方案3】:

正确的代码如下:

#include <stdio.h>

int fun();
int main(){
  int (*p)()=fun;
  (*p)();
  return 0;
}

int fun(){
  printf("Hi..");
  return 0; 
}

1。
int fun();main 中使用之前,您必须声明您的函数;否则main 不会识别它。
2.
int (*p)():声明一个变量p,它是一个指向返回int并且没有参数(或未定义数量的参数,取决于标准)的函数的指针。
3.

int fun();
.........
int (*p)()=fun;

为了使其工作fun 还必须返回int。这意味着在为变量赋值时,它必须具有与变量声明相对应的类型。将值分配给指向返回 int 并且没有参数的函数的指针时,分配给它的函数也必须返回 int 并且没有参数(或未定义数量的参数,取决于标准)。
4.
(*p)();
你调用函数p,它现在指向fun

【讨论】:

  • +1 用于包含标题
  • 啊 - 所以你确实想在使用函数之前声明它们。这是什么书?
  • Yeshwant Kanetkar 测试你的 C 技能..
  • 根据您的编译器标志,它可能会生成 fun() 的隐式声明并报告警告。所以你应该声明它,但你不必这样做。
  • ionela.voinescu - 代替 int .. 不能使用 float 或任何其他数据类型来实现函数乐趣,同时在返回值时声明和定义它..??
猜你喜欢
  • 2015-06-16
  • 1970-01-01
  • 2021-12-27
  • 2013-02-19
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多