C语言 - 参数指针

C语言 - 参数指针 首页 / C语言入门教程 / C语言 - 参数指针

到目前为止,我们已经看到在C编程中,我们可以将变量作为参数传递给函数。我们不能将函数作为参数传递给另一个函数。但是我们可以使用函数指针将函数的引用作为参数传递。此过程称为按引用调用,因为函数参数作为保存参数地址的指针传递。如果函数使用指针进行了任何更改,则它还将在传递的变量的地址处反映更改。

因此,C编程允许您创建一个指向函数的指针,该指针可以作为参数进一步传递给函数。我们可以如下创建一个函数指针:

(type) (*pointer_name)(parameter);

在以上语法中,类型(type)是函数返回的变量类型, * pointer_name 是函数指针,而参数(parameter)是传递给函数的参数列表。

我们来看一个例子:

float (*add)();//this is a legal declaration for the function pointer
float *add();//this is an illegal declaration for the function pointer

函数指针也可以指向另一个函数,或者可以说它保存另一个函数的地址。

float add (int a, int b); //function declaration
float (*a)(int, int); //declaration of a pointer to a function
a=add;//assigning address of add() to 'a' pointer

在上述情况下,我们声明了一个名为" add "的函数。我们还声明了函数指针(* a),该函数返回浮点型值,并包含两个整数类型的参数。现在,我们可以将 add()函数的地址分配给'a'指针,因为它们都具有相同的返回类型(浮点数)和相同类型的参数。

现在," a"是指向add()函数的指针。我们可以通过使用指针" a"来调用add()函数。让我们看看如何做到这一点:

a(2, 3);

上面的语句使用指针'a'调用add()函数,并且在'a'中传递了两个参数,即2和3。

让我们看一个简单的示例,说明如何将函数指针作为参数传递。

void display(void (*p)())
{
    for(int i=1;i<=5;i++)
    {
        p(i);
    }
}
void print_numbers(int num)
{
    cout<<num;
}
int main()
{
    void (*p)(int);    //void function pointer declaration
    printf("The values are :");
  display(print_numbers);
    return 0;
}

在上面的代码中,

  • 我们已经定义了两个名为'display()'和print_numbers()的函数。
  • 在main()方法内部,我们声明了一个名为(* p)的函数指针,并调用了display()函数,并在其中传递了print_numbers()函数。
  • 当控件转到display()函数时,指针* p包含print_numbers()函数的地址。这意味着我们可以使用函数指针* p调用print_numbers()函数。
  • 在display()函数的定义中,我们定义了一个" for"循环,在for循环中,我们使用语句p(i)调用print_numbers()函数。在这里,p(i)表示将在i的每次迭代中调用print_numbers()函数,并打印出" i"的值。

输出

Function pointer as argument in C

现在,我们将在Quicksort函数" qsort"中将函数指针作为参数传递。它使用一种对数组进行排序的算法。

#include <stdio.h>
#include <stdlib.h>

#include<string.h>
int compare(const int *p, const int *q);
int (*f)(const void *a, const void *b);
int main()
{
    int a[]={4,7,6,1,3,2};
    int num=sizeof(a)/sizeof(int);
    f=&compare;
    qsort(a, num, sizeof(int), (*f));
    for(int i=0;i<num;i++)
    {
        printf("%d ,",a[i]);
    }
    
}

int compare(const int *p, const int *q)
{
     if (*p == *q)
        return 0;
    else if (*p < *q)
        return -1;
    else
        return 1;
}

在上面的代码中,

  • 我们定义了一个整数类型的数组。创建数组后,我们使用sizeof()运算符计算了数组的大小,并将大小存储在num中
  • 我们定义了compare()函数,该函数比较数组中的所有元素并按升序排列它们。
  • 我们还声明了函数指针,即(* f),并使用语句f =&compare将compare()函数的地址存储在(* f)中。
  • 我们调用qsort()函数,在其中传递数组,数组的大小,元素的大小和比较函数。比较函数(即compare())将比较数组元素,直到数组中的元素以升序排序。

输出

Function pointer as argument in C

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

邱岳的产品实战 -〔邱岳〕

Nginx核心知识150讲 -〔陶辉〕

MySQL实战45讲 -〔林晓斌〕

透视HTTP协议 -〔罗剑锋(Chrono)〕

打造爆款短视频 -〔周维〕

React Hooks 核心原理与实战 -〔王沛〕

Go 语言项目开发实战 -〔孔令飞〕

AI大模型企业应用实战 -〔蔡超〕

云原生基础架构实战课 -〔潘野〕

好记忆不如烂笔头。留下您的足迹吧 :)