C语言函数指针

C语言调用函数的方法是通过在函数的输入参数中发送我们要处理的数据来调用函数,然后在输出参数中获取结果。 由于其简单性,此方法是程序员常用的 C 编程的一部分,因为它满足创建应用程序所需的所有要求。 然而,C 语言提供了通过指针调用函数的可能性。 这种方法是一个非常强大的工具,在富有创造力的程序员手中,只需几行代码就可以实时为同一程序提供不同的执行动态。

在这个 Linux 您可以在方法文章中了解什么是函数指针。 我们解释如何声明它并为其分配函数所在的内存地址。 我们还将看到如何使用函数的指针调用函数以及如何传递其中的参数。 然后,我们将看到一些带有代码和图像的实际示例,展示如何实现简单的函数指针和数组。

C语言函数指针

函数指针指向函数在内存中所在的起始地址。 与 C 中指向传统变量的指针不同,指向函数的指针作用于计数器,该计数器控制程序存储器的寻址、创建到该地址的跳转并执行代码。

尽管这些指针类型可用于调用函数并取代传统的 C 调用,但它们真正的潜力在于实现函数指针的向量化数组或回调。

C语言中如何声明函数指针

要声明这种类型的指针,我们首先需要知道要分配指针的函数的原型以及它在参数中管理的数据类型。 接下来,让我们看一下声明函数指针的语法:

输出类型 *指针的标识符输入类型;

正如我们所看到的,我们首先需要指定函数输出参数的数据类型,后面是我们要分配给指针的标识符,前面是“*” 运算符并括在括号中。 最后,函数输入参数的数据类型也用括号表示,如果有多个,则必须用逗号分隔。

接下来我们看到指向一个函数的指针“Ptr_func”的声明,该函数的输入参数为 int 类型,其输出为 void 类型:

空的 *指针函数整数;

C语言中如何使用指针给函数分配内存地址

我们已经了解了如何声明指向函数的指针。 现在我们来看看如何将该指针与函数所在的内存地址关联起来。 将地址分配给指针是通过赋值操作完成的,如以下语法所示:

指针ID = & 功能 标识符;

从语法中我们可以看到,前面声明的指针的标识符位于赋值运算符的左侧,而函数的标识符位于右侧,前面带有“&”符号。 以下片段显示了如何将内存地址分配给函数“myfunction”:

指针_f = & 我的函数;

C语言中如何通过指针调用函数

到目前为止,我们已经了解了如何声明函数指针并为其分配内存地址。 现在我们将了解如何通过指针访问该函数来使用它。

要通过指针调用函数,我们需要将指针单独括在括号中,括号的一侧是“*”字符,另一侧是参数变量。 以下片段显示了如何使用指针“Ptr_func”指向的函数“myfunction”,并将变量“a”作为输入参数。

*指针函数 A;

在此示例中,我们将创建一个非常简单的应用程序,其中包含两个函数:main() 函数和 myfunction() 函数。

myfunction() 函数显示作为输入参数发送的字符串,而 main() 函数声明函数指针“Ptr_func”,为其分配 myfunction() 的地址,然后使用其指针调用该函数,传递“str”-字符串作为参数。 下面我们看到这个的代码 example:

#包括

空的 我的函数 字符 *斯特;

空的 主要是
{
字符 *斯特 =我是输入参数”;
空的 * 指针函数 字符*= &我的函数;
*指针函数 斯特;
}

空的 我的函数 字符 *斯特
{

打印函数“我是我的职能%s, 斯特;
}

我们看到的下图显示了这段代码的执行情况:

C 语言中的函数指针数组

现在我们将了解如何通过创建具有多种工作动态且代码很少的程序来发挥函数指针的潜力。

我们在这个过程中将使用到的函数 example 是“func_1”、“func_2”、“func_3”和“func_4”。 它们中的每一个都显示一条消息,指示该程序位于哪个代码片段中。 下面我们看到所描述的函数的代码,我们将其复制并保存在 main() 文件所在目录中的名为“functions.c”的文件中:

空的 函数_1 空的;
空的 函数_2 空的;
空的 函数_3 空的;
空的 函数_4 空的;

空的 函数_1 空的
{

打印函数“代码片段1;
}
空的 函数_2 空的
{

打印函数“代码片段2;
}
空的 函数_3 空的
{

打印函数“代码片段3;
}
空的 函数_4 空的
{

打印函数“代码片段4;
}

现在让我们创建一个 main() 函数,其中包含命令行参数的向量。 在其中我们声明一个 Ptr_f 数组[] 具有五个元素的函数指针,并将函数的地址分配给“functions.c”文件中的每个元素。

该程序包含一个“for”循环,其中转义条件由接收到的命令行参数数量确定,在整数“argc”中指定。 该循环获取接收到的命令行参数,将它们转换为整数,并将获得的值索引到 Ptr_f[] 指针数组。

在循环的每个周期中,都会使用指向 Ptr_f 数组的指针来调用函数,该数组由命令行参数中接收的整数进行索引。 通过这种方式,我们得到了一个执行一系列函数调用的程序,该函数调用由不同的代码片段组成,每个代码片段属于一个函数。 为此,我们看一下 main() 函数的代码 example:

#包括
#包括
#包括
#include“函数.c”

空的 主要是 整数 精氨酸, 字符 * 精液[]
{
空的 * 指针_f[5] 空的={*指针_f ,&函数_1, &函数_2, &函数_3, &函数_4};
字符 坏的;
为了 整数= 1;!= 精氨酸;++

{

*指针_f[atoi(argv[i]];

}

}

现在我们编译此代码并使用它来创建可执行文件(.bin),如下所示:

现在让我们通过调用序列 1、2、3、4 来运行该程序,如下所示:

正如我们在图中看到的,程序执行了调用序列 1、2、3 和 4。 现在让我们看一个更复杂的调用序列:

我们可以看到,该程序可以实时执行各种编译后的代码序列。 虽然这个 example 是一个简单的程序,可以帮助读者更好地理解这个概念。 这种方法可以提供强大的处理资源。

文凭

在这个 Linux 在方法文章中,我们刚刚解释了 C 语言中的函数指针是什么、如何声明它们、如何分配函数的地址以及如何使用其指针调用它。

然后,我们在实际示例中实现了函数指针,其中的代码片段和图像显示了使用函数指针的最简单方法。 在另一节中,我们向您展示了如何实现向量化函数指针,从而充分发挥这一强大 C 资源的潜力。