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

时间:2022-05-07 16:45:47

函数类型

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*)的函数