您的位置:首页 > 其它

函数 与 指针 分析

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐