主题四 指针和数组(下)----28.函数与指针分析

来源:互联网 发布:天戏网络 编辑:程序博客网 时间:2024/06/03 15:30

函数类型

C语言中的函数也有自己的类型。

函数的类型由返回值,参数类型(还有参数顺序)和参数个数共同决定。

例: int add(int i,int j)的类型为int(int,int)

C语言中通过typedef为函数类型重命名,typedef type name(parameter list)

例:typedef int f(int,int);  typedef void p(int);

 

函数指针

函数指针用于指向一个函数

函数名是执行函数体的入口地址

可通过函数类型定义函数指针:FuncType* pointer;或者直接定义;Functype(*pointer)(parameter list);其中pointer为函数指针变量名,type为指向函数的返回值的类型,parameter list为指向函数的参数类型列表。

 

例:函数指针的本质与使用

#include <stdio.h>typedef int(FUNC)(int);int test(int i){    return i * i;}void f(){    printf("Call f()...\n");}int main(){    FUNC* pt = test;        void(*pf)() = &f;        pf();    (*pf)();        printf("Function pointer call: %d\n", pt(2));}

回调函数

回调函数是利用函数指针实现的一种调用机制,来解决只有在执行到某阶段时才知道应该调用那个函数的实际问题。

回调函数原理:

调用者不知道具体事件发生的时候需要调用的具体函数

被调用者不知道自己何时被调用,只知道被调用后需要完成的任务

当具体事件发生时,调用者通过函数指针调用具体函数

回调机制将调用者和被调用函数分开,两者互不依赖,更加灵活,且适合模块化接口化编程

 

例:回调函数实例

#include <stdio.h>typedef int(*FUNCTION)(int);int g(int n, FUNCTION f){    int i = 0;    int ret = 0;        for(i=1; i<=n; i++)    {        ret += i*f(i);    }        return ret;}int f1(int x){    return x + 1;}int f2(int x){    return 2*x - 1;}int f3(int x){    return -x; }int main(){    printf("x * f1(x): %d\n", g(3, f1));    printf("x * f2(x): %d\n", g(3, f2));    printf("x * f3(x): %d\n", g(3, f3));}


复杂指针函数的阅读技巧---右左法则

1.从最里层的圆括号中未定义的标识符看起

2.首先往右看,再往左看

3.当遇到圆括号或者方括号的时候就可以确认部分类型

4.对剩余未确认部分重复2,3步骤,直到阅读结束。

 

 

例:解读以下复杂指针

#include <stdio.h>int main(){     int (*p2)(int*, int (*f)(int*));        int (*p3[5])(int*);        int (*(*p4)[5])(int*);        int (*(*p5)(int*))[5];}//int (*p3[5])(int*)<===>p3[5]数组<===>int (*)(int *)<===>*p3[5]是指针数组,大小为5<===>int ()(int *)每个数组元素是int(int*)的函数//int (*(*p4)[5])(int*)<===>(*p4)是指针<===>int(*[5])(int*)<===>p4是数组指针,指向一个5个大小的数组
//<===>int(*)(int*)<===>每个数组元素是指针<===>int()(int*)<===>每个元素指针指向一个类型为int()(int*)的函数




阅读全文
0 0