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

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

技术教程推荐

TensorFlow快速入门与实战 -〔彭靖田〕

Spring Boot与Kubernetes云原生微服务实践 -〔杨波〕

分布式协议与算法实战 -〔韩健〕

人人都用得上的写作课 -〔涵柏〕

手把手带你写一门编程语言 -〔宫文学〕

HarmonyOS快速入门与实战 -〔QCon+案例研习社〕

遗留系统现代化实战 -〔姚琪琳〕

运维监控系统实战笔记 -〔秦晓辉〕

AI 应用实战课 -〔黄佳〕

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