指针函数

返回值是指针的函数,如void* malloc(...)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int *newAdd(int a, int b); // 声明指针函数 main() {
int *p1 = NULL;
p1 = newAdd(1, 2);
printf("p1 = 0x%x \n", p1);
printf("*p1 = %d \n", *p1);
getchar();
} int *newAdd(int a, int b) {
int *p = (int *)malloc(sizeof(int));
memset(p, 0, sizeof(int));
printf(" 函数内:p = 0x%x \n", p); *p = a + b;
printf(" 函数内:*p = %d \n", *p); return p;
}

函数中创建“数组”

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int *createArray(int n) {
int *p = (int *)malloc(n * sizeof(int));
memset(p, 0, n * sizeof(int));
int *q = p;
for(int i = 0 ; i<n; i++) {
*(q++) = i*i;
}
return p;
}
main() {
int *p = NULL;
p = createArray(10);
int *q = p;
while(p-q<10) {
printf("%d ", *p);
p++;
}
//TODO:释放内存
}

函数指针

指向函数的指针

#include<stdio.h>
int addition(int x,int y) {
return (x+y);
}
int subtraction(int x,int y) {
return (x-y);
}
int multiplication(int x,int y) {
return (x*y);
}
int division(int x,int y) {
return (x/y);
}
int main() {
int a, b, symbol, ret;
scanf("%d",&a);
getchar();// Enter会被当做输入字符,丢弃
symbol = getchar();
scanf("%d",&b);
switch(symbol) {
case '+':
ret = addition(a, b);
break;
case '-':
ret =subtraction(a,b);
break;
default:
ret = -999;
break;
}
printf("%d%c%d=%d", a,symbol,b,ret);
return 0;
}

每个函数有一个地址,即该函数第一条指令的地址,

可以用一个指针来保存这个地址,而这个指针就是函数指针。

可以用该指针来调用这个函数。

#include<stdio.h>
int addition(int x,int y) {
return (x+y);
}
int subtraction(int x,int y) {
return (x-y);
}
int multiplication(int x,int y) {
return (x*y);
}
int division(int x,int y) {
return (x/y);
}
int main() {
int (*p)(int, int);
int a, b, symbol, ret;
scanf("%d",&a);
getchar();// Enter会被当做输入字符,丢弃
symbol = getchar();
scanf("%d",&b);
switch(symbol) {
case '+':
p = addition;
break;
case '-':
p =subtraction;
break;
default:
ret = -999;
break;
}
ret = (*p)(a,b);
printf("%d%c%d=%d", a,symbol,b,ret);
return 0;
}

函数指针数组

一组指向函数的指针

例:直接计算100*5

#include<stdio.h>
int addition(int x,int y) {
return (x+y);
}
int subtraction(int x,int y) {
return (x-y);
}
int multiplication(int x,int y) {
return (x*y);
}
int division(int x,int y) {
return (x/y);
}
int main() { int a, b, symbol, ret;
a = 100;
b = 5; //int (*p)(int, int);
int (*p[])(int, int) = {addition,subtraction,multiplication,division}; ret = (*p[2])(a,b);
printf("%d * %d=%d \n", a,b,ret); ret = p[2](a,b);
printf("%d * %d=%d \n", a,b,ret);
return 0;
}

运行结果:

100 * 5=500
100 * 5=500

最新文章

  1. [资料分享]2016 黑马 Java 19期视频+Hadoop大数据实战视频
  2. JavaScript:编程改变文本样式
  3. TortoiseGit流程安装使用手册
  4. 基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送
  5. python windows安装
  6. 使用Antlr实现简单的DSL
  7. java中在linux下利用jstack检测死锁
  8. JS中关于JS文件的引用以及问题
  9. phpDesigner 7.2.5 注册码 更改 语法高亮 主题
  10. ThinkPHP调试模式与日志记录
  11. 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)
  12. C语言必背18个经典程序
  13. java.util.MissingResourceException解决策
  14. JavaScript进阶(三) 值传递和引用传递
  15. 《Javascript高级程序设计》读书笔记之对象创建
  16. 设计模式---Manager(管理器)
  17. 使用HttpClient和WebRequest时POST一个对象的写法
  18. BZOJ.4340.[BJOI2015]隐身术(后缀数组 搜索)
  19. MySQL之Haproxy+Keepalived+MySQL高可用均衡负载部署 (网络摘抄)
  20. .NET Core开发日志——Runtime IDentifier

热门文章

  1. EXCEL计数时间差--分钟数
  2. Windows定时任务copy到nfs目录
  3. JAVA学习第一阶段(2)
  4. git/SQL/正则表达式的在线练习网站
  5. leetcode93:insert-interval
  6. 【笔记】拉勾Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架
  7. javaweb项目中jsp的from表单提交action内容与web.xml的servlet-mapping对应
  8. GSO和TSO
  9. 极客mysql38
  10. redis-server文件启动cmd一闪而过