龙空技术网

Python动态类型想到的:C语言中的函数指针

洪较瘦不着调退役it人 156

前言:

而今大家对“python3 指针”可能比较讲究,同学们都想要学习一些“python3 指针”的相关知识。那么小编在网络上搜集了一些关于“python3 指针””的相关文章,希望兄弟们能喜欢,朋友们快快来学习一下吧!

以下是有关函数指针的一些有趣事实。

Function Pointer in C姑且翻译为函数指针1) 与普通指针不同,函数指针指向代码,而不是数据。通常,函数指针存储可执行代码的开头。2)与普通指针不同,我们不使用函数指针来分配取消分配内存。3)函数的名称也可以用来获取函数的地址。例如,在下面的程序中,我们删除了赋值中的地址运算符“&”。我们还通过删除 * 更改了函数调用,程序仍然有效。

#include <stdio.h>void fun(int a) {    printf("Value of a is %d\n", a);}
void main() {  void (*fun_ptr)(int) = &fun;  printf("\n====\n");  printf(fun_ptr);  printf("\n======\n");    test();  (*fun_ptr)(10);  fun_ptr(1);}

仔细观察这一个语句 void (*fun_ptr)(int) = &fun;

void fun(int a) {        printf("Value of a is %d\n", a);}

void (*fun_ptr)(int) = &fun;实际上相当于以下的两条语句

void (*fun_ptr)(int); fun_ptr = &fun;

fun_pt是一种指针,他的值是 &取地址操作,谁的地址? 这个函数 fun;

同时可以发现 fun_p的定义实际上与fun这个函数的结构是一样的,返回值,参数类型与个数

C语言的函数指针放在一边,我们看一下Python代码

一定会想到这样的代码,在Python中

>>> def fun(i):	print(i)>>> p_tr = fun>>> id(fun)2077870833088>>> id(p_tr)2077870833088>>> fun(1)1>>> p_tr(2)2>>> 

可以看到p_str与fun这两个对象的id是一样的,p_str也是一个函数它的功能与fun是一样的,因为它们本来就是同一个对象。

函数指针的声明赋值与调用

参照上文中的Python逻辑在C语言可以

fun_ptr(1); 像正常的函数一样调用(*fun_ptr)(10);也可以取到这个地址值(*fun_ptr)然后加上括号与参数就变成了函数调用

void fun(int a) {        printf("Value of a is %d\n", a);}void main() {  void (*fun_ptr)(int) = &fun;  (*fun_ptr)(10);  fun_ptr(1);}

使用codeblocks中我们测试一下这个函数指针

其中我加了一段代码,,打印这函数指针名,发现它打印出来 的是一段乱码

printf(fun_ptr);
使用函数指针动态执行不同的函数

两个数四则运算

#include <stdio.h>void add(int a, int b){    printf("Addition is %d\n", a+b);}void subtract(int a, int b){    printf("Subtraction is %d\n", a-b);}void multiply(int a, int b){    printf("Multiplication is %d\n", a*b);}int main(){    // fun_ptr_arr is an array of function pointers    void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply};    unsigned int ch, a = 15, b = 10;    printf("Enter Choice: 0 for add, 1 for subtract and 2 "            "for multiply\n");    scanf("%d", &ch);    if (ch > 2) return 0;    (*fun_ptr_arr[ch])(a, b);    return 0;}

在这里我们定义了四个函数分别代码加减乘除四个方法,这四个方法共同特征是两个整数参数,一个返回值,唯一的区别是逻辑不一样。

void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply};
4)像普通指针一样,可以有一个函数指针数组。根据用法输入的操作数,找到函数指针数组中对应的函数,然后调用。

写到这里我想起在Java中有一种类似的情况。大家可以回忆一下。

回调函数实现

在Java中我们使用一个匿名类来实现回调排序的写法,使用Comparator接口实现来完成回调

 Integer[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};        Arrays.sort(arr, new Comparator<Integer>() {            @Override            public int compare(Integer o1, Integer o2) {                return o1-o2;            }        }); 
在C语言中应该如何更好的实现自定义排序逻辑

在 C 语言中,我们可以使用函数指针来避免代码冗余。

例如,一个简单的 qsort() 函数可用于按升序或降序对数组进行排序,或者在结构数组的情况下按任何其他顺序对数组进行排序。

// An example for qsort and comparator #include <stdio.h> #include <stdlib.h> int compare (const void * a, const void * b)  {   return ( *(int*)a - *(int*)b ); }   int main ()   {   int arr[] = {10, 5, 15, 12, 90, 80};   int n = sizeof(arr)/sizeof(arr[0]), i;   qsort (arr, n, sizeof(int), compare);     for (i=0; i<n; i++)      printf ("%d ", arr[i]);   return 0; } 

使用函数指针和 void 指针,还可以将 qsort 用于任何数据类型。

标签: #python3 指针