主题四 指针和数组(下)----28.函数与指针分析
2017-06-15 22:04
363 查看
函数类型
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));
}
回调函数
回调函数是利用函数指针实现的一种调用机制,来解决只有在执行到某阶段时才知道应该调用那个函数的实际问题。
回调函数原理:
调用者不知道具体事件发生的时候需要调用的具体函数
被调用者不知道自己何时被调用,只知道被调用后需要完成的任务
当具体事件发生时,调用者通过函数指针调用具体函数
回调机制将调用者和被调用函数分开,两者互不依赖,更加灵活,且适合模块化接口化编程
例:回调函数实例
复杂指针函数的阅读技巧---右左法则
1.从最里层的圆括号中未定义的标识符看起
2.首先往右看,再往左看
3.当遇到圆括号或者方括号的时候就可以确认部分类型
4.对剩余未确认部分重复2,3步骤,直到阅读结束。
例:解读以下复杂指针
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*)的函数
相关文章推荐
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 实验九指针1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- C++ 二级指针、函数指针与数组复合类型的问题分析
- 主题四 指针和数组(下)----25.指针数组与数组指针分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 实验9 指针1 1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 简单分析 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
- 28 分析函数优化自连接,减少表访问次数 --优化主题系列
- 笔记4:指针和数组、函数结合分析
- 主题四 指针和数组(上)----24.数组与指针分析
- 实验9 指针1 、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- C语言中字符数组和字符串指针分析
- C语言之指针、数组和函数
- 对C/C++函数中指针与数组的研究.
- 转载Mobidogs指针, 指针的指针, 数组, 指针数组, 数组指针, 指针函数, 函数指针
- 指针, 指针的指针, 数组, 指针数组, 数组指针, 指针函数, 函数指针
- C语言中字符数组和字符串指针分析