一、指针函数

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

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. 网际互连__TCP/IP三次握手和四次挥手

    在TCP/IP协议中,TCP协议提供可靠的连接服务. 位码即tcp标志位,有6种标示: SYN(synchronous建立联机).ACK(acknowledgement 确认).PSH(push传送) ...

  2. Leetcode LRU缓存,数组+结构体实现

    一.算法思路 LRUCache类有以下函数和变量: LRUCache(int capacity): capacity是当前对象能够存储的键值对(key,value)最大个数. int get(int ...

  3. TypeScript中的private、protected

    首先我们要清楚 private . protected 现阶段只是javascript中的保留字(Reserved words),而非关键字(Keywords ).因此TypeScript中的纯类型声 ...

  4. left join与inner join

    举例a.b表: bId bNum 1 20 2 30 aId aNum 1 10 2 20 3 30 left join以左表为准 select * from a left join b on a.a ...

  5. 【noi 2.6_6049】买书(DP)

    题意:有N元,有无限多本10.20.50和100元的书,问有几种购买方案. 解法:f[i]表示用 i 元的方案数.还有一个 j 循环这次买多少元的书. 注意--要先 j 循环,再 i 循环.因为要先考 ...

  6. hdu3461 Code Lock

    Problem Description A lock you use has a code system to be opened instead of a key. The lock contain ...

  7. Codeforces Round #582 (Div. 3) A. Chips Moving

    传送门 题解: 给你n个数的坐标,你需要把他们移动到一个位置,有两种移动方式 1.向左或者右移动2 2.向左或者右移动1,但是耗费1 求最小耗费 题解: 很简单就可以想到,看一下偶数坐标多还是奇数坐标 ...

  8. Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) D. Extreme Subtraction (贪心)

    题意:有一个长度为\(n\)的序列,可以任意取\(k(1\le k\le n)\),对序列前\(k\)项或者后\(k\)减\(1\),可以进行任意次操作,问是否可以使所有元素都变成\(0\). 题解: ...

  9. HDU - 6030 矩阵快速幂 +多组输入快速幂板子

    题意:一个项链用n个珠子构成,是一个条而不是一个环,由红和蓝两种颜色构成,要求以任意点为起点向后的素数个珠子中,保证红颜色的大于等于蓝颜色的,问你有多少种方案满足,范围:n(2≤n≤1018) 推导过 ...

  10. Java对象延迟初始化的实现

    一.什么是延迟初始化? 在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销. 延迟初始化实际上就是:当我们要进行一些高开销的对象初始化操作时,只有在使用这些对象时才进行初始 ...