一、指针函数

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

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. HBase协处理器加载过程(1.2.x)

    一.首先来看ObserverCoprocessor:1.观察者协处理器的静态加载的配置是在hbase-site.xml中配置如下属性:通过hbase.coprocessor.region.classe ...

  2. 最短路-SPFA算法&Floyd算法

    SPFA算法 算法复杂度 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环. SPFA一般情况复杂度是O(m)最坏情况下复杂度和朴素 ...

  3. Pycharm怎么安装?

    摘要:工欲善其事必先利其器,每个人都有自己心中理想的集成开发环境,这里我们不做讨论,今天只介绍Pycharm怎么安装. 首先打开官网:https://www.jetbrains.com/pycharm ...

  4. Codeforces Round #628 (Div. 2) C. Ehab and Path-etic MEXs(树,思维题)

    题意: 给有 n 个点的树的 n-1 条边从 0 到 n-2 编号,使得任意两点路径中未出现的最小数最小的方案. 思路: 先给所有度为 1 的点所在边编号,之后其他点可以随意编排. #include ...

  5. Poj-3922 A simple stone game(k倍动态减法)

    题意: 游戏是这样的:两个玩家以一堆n个石头开始游戏.他们轮流从石堆里取石头,每次至少取一块.先走的人第一步最多可以拿n-1块石头.从那时起,一个玩家最多可以拿k倍于他的对手上次拿的石头.例如,如果一 ...

  6. C# 替换文件名的字符

    https://www.cnblogs.com/lindexi/p/8970466.html

  7. 80x86/Pentium微机原理及接口技术-微处理器-学习笔记

    80x86/  Pentium微机原理及接口技术 1.    计算机基础... 1 1.1常用术语... 1 1.2计算机中数与编码的表示方法... 1 1.2.1进制表示及进制转换... 1 1.2 ...

  8. CentOS7安装配置 NFS

    一.NFS 简介 NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端N ...

  9. codeforces 8C(非原创)

    C. Looking for Order time limit per test 4 seconds memory limit per test 512 megabytes input standar ...

  10. hdu 4465 Candy (非原创)

    LazyChild is a lazy child who likes candy very much. Despite being very young, he has two large cand ...