函数 与 指针 分析
2017-02-11 13:27
176 查看
函数类型
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;
也可以直接定义:
type (*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++) { if (i == n) 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));//这样写,叫做注册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*)); //从 p2开始看,p2是函数指针, //第一个参数类型为 int* ,第二个参数为函数指针, //返回值类型为int int (*p3[5])(int*); //从 p3开始看,p3是函数指针的数组,有5个元素,每个元素都为一个函数指针 //参数类型为int* //返回值类型为int int (*(*p4)[5])(int*); //从 p4开始看,p4是指向函数指针的数组的数组指针,该数组有5个元素,每个元素都为函数指针 //参数类型为int* //返回值类型为int int (*(*p5)(int*))[5]; //解释在下面 }
p5是一个函数指针,函数的参数为int*,返回类型为一个指向5元素数组的数组指针,参考下面例程
typedef int(a)[5]; a* f(int* x) { int a[5] = {0}; return &a; } int main() { int a[5] = {0}; int (*(*p5)(int*))[5]; p5 = f; }
相关文章推荐
- 一个关于函数内部指针参数返回的错误调试及分析
- [转载] 类成员函数指针深度分析
- 实验9 指针1 1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- C++利用二级指针做函数形参来进行修改实参的实例分析
- 【分析】一个C++溢出虚函数指针的更真实试验
- C语言深度剖析-----函数与指针分析
- 实验九指针1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 函数与指针分析
- C语言 函数指针调用时加星号与不加星号的分析
- Pa2 函数指针 指针函数 分析 (转)
- 函数指针的透彻分析
- 函数指针的透彻分析
- 实验9 指针1 、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依
- 函数调用分析(普通调用,静态函数调用,指针调用)
- 函数调用分析(普通调用,静态函数调用,指针调用)
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 从汇编的角度分析函数指针
- C语言深度剖析-----函数与指针的分析