【103】指针-指针函数-回调函数-数组指针-指针数组

函数指针、回调函数

0指针

Int a ;//定义整型变量

Int *p;//定义指针变量

-------------------------------

Int a = 10;  //整形变量的初始化

P = &a ;   //指针变量的初始化,取地址

则 *p <=> a

 

通过上面例子可以知道,通过指针可以获取其他变量所存的值。

【2】数组和指针的关系

P [i]  < = > *(p+i)  // 数组名是个指针常量,存放了数组的第一个元素的地址。

 

【3】函数名,其实也是个地址

和数组名类似,函数名也存放了函数的地址。

  1. 函数指针:指向函数的指针 //指针函数只是函数的返回值是指针

例如:

void (*p)(void) //函数指针,指向无参数无返回值的函数

Void *(*p)(int *)//函数指针,指向 void * fun_name(int *a) 形式的函数

好处: p可以随意修改。

 

#include <stdio.h> 

int max(int x, int y) 

{ 

return x > y ? x : y;

} 

int main(void) 

{ 

//  先定义函数指针 *p ,并将初始化(给函数指针赋值)

int (* p)(int, int) = & max; // &可以省略         

int a, b, c, d;

printf("请输入三个数字:");

scanf("%d %d %d", & a, & b, & c);

/* 与直接调用函数等价,d = max(max(a, b), c) */

//函数指针的调用形式

d = p(p(a, b), c);   //函数指针的运行方式(实际就是函数指针所指向的函数的运行方式),可以是p();或者原始的调用方式(*p)() ;

printf("最大的数字是: %d\n", d);

return 0;

}

  1. 回调函数,当函数指针被用作函数的参数。

函数指针被作为函数 xxxx 的参数,xxxx函数成为回调函数。

功能: 将双向依赖改为单向依赖的工具。

回调函数:在定义的模块不运行,交给另一个模块运行 的函数。(简单说就是调用一个函数,这个函数用去调用其他的函数)

使用条件:

2.1 简单例子:可以直观的看下回调函数的形式

 

3回调函数,用以改变库run.c 的某些行为

 

3.1 不带参数

Run.c

#include <unistd.h>

//在run循环里,每隔1S运行一个函数,这个函数有main 来指定(函数放在main.c里)

 

Void (*step)(void) = NULL;  //函数指针

Void run(void)

{

Int ct=0;

While (1)

{

If(Step() != NULL)

Step();

Ct ++;

Sleep(1);

}

 

}

//安装函数

Void cb_install (void(*p)(void))

{

Step = p;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Main.c

 

//声明后再使用

//Extern void(*step)(void);

Void cb_install (void(*p)(void));

 

Void mystep_cb(void)

{

Print(“ 即使到秒\n”);

}

Int main(void)

 

{

Cb_install(mystep_cb)

//Step = mystep_cb;

Run();

}

 

 

 

3.2 带参数

Run.c

#include <unistd.h>

//在run循环里,每隔1S运行一个函数,这个函数有main 来指定(函数放在main.c里)

 

Void (*step)(int) = NULL;  //函数指针

Void run(void)

{

Int ct=0;

While (1)

{

If(Step() != NULL)

Step(ct);

Ct ++;

Sleep(1);

}

 

}

//安装函数

Void cb_install (void(*p)(int))

{

Step = p;

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Main.c

 

//声明后再使用

Void cb_install (void(*p)(int));

 

Void mystep_cb(int i)

{

Print(“ 即使到秒,i=%d\n”, i);

 

}

Int main(void)

 

{

Cb_install(mystep_cb)

Run()  

 

}

 

 

 

 

 

 

 

 

 

4数组指针

Int  v[2][10] = {

{1,2,3,4,5,6,7,8,9,10},

{11,12,13,14,15,16,17,18,19,20}

};

Int (*a)[10] = v; //数组指针,指针指向一个10个int元素的数组。

 

【5】指针数组

Int p = 5;

Int p2 = 6;

Int *p[5];

Ptr[0] = &p;  //ptr[] 存放的是地址,他指向的位置就是    //*ptr[0]

Ptr[1] = & p2;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值