一、指针函数

函数的返回值是指针类型。

int* fun(int a,int b);

指针函数使用:

返回字符串

这里要注意,"1234567890abc"是字符串常量,*p指向的字符串地址,返回的是这个地址,因为字符串常量不会因为函数消亡而释放,所有主函数依然可以访问到地址的内容。

#include <stdio.h>

char* str(){
char *p="1234567890abc";
return p;
} void main(){
printf("%s",str());
}

返回申请堆空间的内容

#include <stdio.h>

int* str(){
//申请堆空间
int *p=malloc(20*sizeof(int));
//打印地址
printf("addr p:%d\r\n",p);
//数据存储
for(int i=0;i<20;i++){
p[i]=i;
}
return p;
} void main(){
//调用
int *p=str();
//地址
printf("addr p:%d\r\n",p);
//数据输出
for(int i=0;i<20;i++) {
printf("%d",p[i]);
}
//释放堆空间
free(p);
}

二、函数指针

如int类型指针(int* p)一样,是一种指针类型

定义了一个函数,那么编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

定义形式:

返回值类型 (*函数指针变量名)(形参1类型,形参2类型,…)

如函数原型:

int fun1(int a,int b);

函数指针为:

int (*funp)(int,int)

 

如函数原型:

void fun2();

函数指针为:

void (*fun2p)();

使用时直接将函数名赋值给函数指针(指针变量名)即可,如:

#include <stdio.h>
//找最大值
int max(int a,int b){
if(a>b) return a;
return b;
}
//找最小值
int min(int a,int b){
if(a<b) return a;
return b;
} void main(){
//定义函数指针变量 pfun
int (*pfun)(int,int); //赋值函数指针,找最大值
pfun=max;//或者为&max
int c=pfun(10,20);
printf("%d\r\n",c); //赋值函数指针,找最小值
pfun=min; //或者为&min
c=pfun(10,20);
printf("%d\r\n",c);
}

输出:

三、  回调函数

回调函数其实就是使用函数指针作为函数的形参

#include <stdio.h>
//找最大值
int max(int a,int b){
if(a>b) return a;
return b;
}
//找最小值
int min(int a,int b){
if(a<b) return a;
return b;
}
//函数入口
int all(int a,int b,int (*pfun)(int,int)){
return pfun(a,b);
}
void main(){
int c=0;
//找最大值调用
c=all(10,20,max);
printf("%d\r\n",c);
//找最小值调用
c=all(10,20,min);
printf("%d\r\n",c);
}

无返回值和无参数

#include <stdio.h>
void pa(){
printf("aaaaaaaaaaaa\r\n");
}
void pb(){
printf("bbbbbbbbbbbb\r\n");
}
int pall(void (*pfun)()){
pfun();
}
void main(){
pall(pa);
pall(pb);
}

执行结果

【不在混淆的C】指针函数、函数指针、回调函数的更多相关文章

  1. c++指针函数的使用——回调函数

    /* 函数指针 函数也是有地址的 所谓函数指针,就是指向函数的指针,函数指针也是一个变量,可以指向不同的函数.同时通过函数指针可以调用其指向函数,从而使函数的调用更加灵活. 函数指针的用途 */ #i ...

  2. C++-函数与指针的关系(回调函数)

    1.函数类型 C语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 ★ int add(int i, int j)的类型为int(int, int) C语言中通过typede ...

  3. JS中的匿名函数、回调函数、匿名回调函数

    工欲善其事必先利其器 在学习JavaScript设计模式一书时,遇到了“匿名回调函数”这个概念,有点疑惑,查找了些资料重新看了下函数的相关知识点之后,对这个概念有了认识.九层之台,起于垒土.在熟悉这一 ...

  4. golang中匿名函数的应用-回调函数-闭包

    package main import ( "fmt" "strconv" ) type funcType func(int, int) int // 自定义函 ...

  5. mongoose的update函数中的回调函数是必须要传的吗

    mongoose中的update的回调函数是必须要传的,如果不传,则不会更新. 例如这样写是不会更新的 tagModel.update({name:tagName},{$inc:{total:1}}, ...

  6. $.ajax({ }) 里面的success函数不执行 | 回调函数返回的值 用对象,下标,键值对访问不到时

    原因一般是  dataType:'json' 数据类型设置成了json  ,去掉这个设置即可 $.ajax({ }) 回调函数返回的值 用对象,下标,键值对访问不到时,考虑是否返回数据为字符串 考虑是 ...

  7. LUA使用虚函数与使用回调函数

    ------------------虚函数overload-------------------------- --回调:寻路中格子坐标改变 CHero.OnSearchToCellsChange = ...

  8. 在Java中如何编写回调函数,以及回调函数的简单应用

    import static java.lang.System.out; import static java.lang.System.err; import java.util.logging.Lev ...

  9. Promise对象的resolve回调函数和reject回调函数使用

    Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量 Promise是一个构造函数 new Promise() 得到一个Promise一个实例 在Promise上有两个函数分别是 ...

  10. js for 循环中有异步函数时,回调函数总是最后一步的值。

    原因:for循环执行时不会等待异步函数执行. 解决方法: 1.改为递归函数(暂时不会). 2.构建一个自执行函数传参(匿名函数) 参考::https://www.cnblogs.com/csuwuji ...

随机推荐

  1. REST架构及其介绍

    概述     REST是英文Representational State Transfer的缩写,中文翻译:表述性状态转移.     他是由Roy Thomas Fielding博士在他的论文 < ...

  2. Python开发桌面微型计算器

    开发Windows窗口需要用到tkinter库 所以上来的第一件事就是: import tkinter as t window = t.Tk()#创建了一个窗口 window.title('微型计算器 ...

  3. 【函数分享】每日PHP函数分享(2021-2-6)

    array_combine - 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 说明: array_combine ( array $keys , array $values ) : ...

  4. Codeforces Round #646 (Div. 2) C. Game On Leaves(树上博弈)

    题目链接:https://codeforces.com/contest/1363/problem/C 题意 有一棵 $n$ 个结点的树,每次只能取叶子结点,判断谁能最先取到结点 $x$ . 题解 除非 ...

  5. hdu5637 Transform (bfs+预处理)

    Problem Description A list of n integers are given. For an integer x you can do the following operat ...

  6. java中static修改成员变量和函数和其他使用

    一.通过static修饰的成员变量初始化只会初始化一次 //静态变量初始化只会初始化一次 public class zuishuai { public static void main(String[ ...

  7. hdu3564 Another LIS

    Problem Description There is a sequence firstly empty. We begin to add number from 1 to N to the seq ...

  8. FZU1894 志愿者选拔

    Problem Description 世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动.参加志愿者选拔的同学们排队接受面试官们的面试.参加面试的同学们按照先来先面试并且先结束的原则接受面试官们 ...

  9. 7.PowerShell DSC之模式

    DSC两种模式 DSC有两种模式,Push模式和Pull模式 Push模式 基本流程 写配置--编译生成mof--推送到目标服务器,由目标服务器LCM执行mof并进行指定的配置 优点 架构简单.成本低 ...

  10. ELK + Redis 日志收集 & HAProxy

    参考博文:http://www.ttlsa.com/linux/haproxy-log-configuration-syslog/ 引入 Redis 消息队列 Log-file 收集数据到 Redis ...