当前位置: 首页 > news >正文

LinuxC高级day05(函数指针、条件编译)

【1】函数指针

概念

本质是指针,指向了函数,和数组指针类似

 定义格式

数据类型    (*指针名) (参数列表);

函数名 : 函数首地址

例:

#include <stdio.h>
int add(int a, int b) //add函数名:函数的地址
{return a + b;
}int sub(int a, int b) //sub类型: int (*) (int,int)
{return a - b;
}int main(int argc, char const *argv[])
{int (*p)(int, int); //定义了函数指针p = add;            //让函数指针p指向add函数printf("%d\n", add(1, 2)); //通过函数名直接调用函数printf("%d\n", p(1, 2));   //通过函数指针间接调用所指的函数p = sub;printf("%d\n", sub(1, 2)); //通过函数名直接调用函数printf("%d\n", p(1, 2));   //通过函数指针间接调用所指的函数return 0;
}

 把函数指针当成参数传递给函数。实现一个接口,多种方法

例:

#include <stdio.h>
int add(int a, int b)
{return a + b;
}int sub(int a, int b)
{return a - b;
}int test(int (*p)(int, int), int a, int b)  //p=add, a=1, b=2;     p=sub,a=1,b=2
{return p(a, b);  //add(1,2);  sub(1,2);
}int main(int argc, char const *argv[])
{printf("%d\n", test(add, 1, 2));printf("%d\n", test(sub, 1, 2));return 0;
}

 函数指针数组

本质是数组,数组中元素是函数指针

格式

数据类型 (*数组名[元素个数])(形参列表)

数据类型 : 和函数指针指向的函数的返回值一致

形参列表 : 和函数指针指向的函数参数一致

赋值 

int (*arr[3])(int,int) = {函数名}

例:

#include <stdio.h>int add(int a, int b)
{return a + b;
}int sub(int a, int b)
{return a - b;
}int main(int argc, char const *argv[])
{int (*arr[2])(int, int) = {add, sub};   //函数指针数组printf("%d\n", arr[0](1, 2)); //add(1,2);printf("%d\n", arr[1](1, 2)); //sub(1,2);return 0;
}

练习

a) 一个整型数
int a;
b) 一个指向整型的指针
int *p=&a;
c)一个指向指针的指针,它指向的指针是一个指向一个整型数
int a;
int *p=&a;
in **q=&p;
d)一个有10个整型数的数组
int a[10];
e)一个有10个指针的数组,该指针是指向一个整型数的
int *arr[10];
f)一个指向有10个整型数数组的指针
int a[1][10]
int (*p)[10]=a;
或者
int arr[10];
p = &arr;  //相当于升级,把列地址arr升级为行地址

【2】条件编译

按照条件是否满足决定代码是否被编译,是预处理指令 简单来说就是 后面的条件语句(condition)如果执行结果不为 0 ,则该#if语句块内的代码会被编译,否则就不会被编译

1.根据宏是否定义

#define 宏名
#ifdef  宏名代码块1
#else 代码块2
#endif

2.根据宏值

#define  宏名  值
#if  宏名代码块1
#else 代码块2
#endif

3.防止头文件重复包含在头文件里

#ifndef  宏名
#define  宏名头文件中的语句
#endif

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python酷库之旅-第三方库Pandas(078)
  • Python知识点:如何使用Arcade进行简易游戏开发
  • 手机电量消耗分析工具 Battery Historian 指南
  • matlab求解方程
  • redis面试(十四)公平锁可重入
  • 【Linux入门】root密码忘记了怎么办?
  • 乳制品企业怎么防止信息泄露?使用加密软件保障数据安全
  • laravel 11 使用jw-auth进行API 登录
  • vs2022 启动之后崩溃解决方案
  • 学习嵌入式入门(十)高级定时器简介及实验(下)
  • 关于MariaDB
  • 测试需求分析(四)
  • winform中设置DateTimePicker参数为空
  • 【C++】什么是模板?
  • 第二证券:虚拟现实概念强势,博士眼镜三连板,星星科技涨停
  • 230. Kth Smallest Element in a BST
  • AngularJS指令开发(1)——参数详解
  • CEF与代理
  • css选择器
  • java8-模拟hadoop
  • MySQL几个简单SQL的优化
  • python docx文档转html页面
  • SpiderData 2019年2月13日 DApp数据排行榜
  • spring + angular 实现导出excel
  • SSH 免密登录
  • tweak 支持第三方库
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • WebSocket使用
  • windows下mongoDB的环境配置
  • 安装python包到指定虚拟环境
  • 编写高质量JavaScript代码之并发
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 基于 Babel 的 npm 包最小化设置
  • 面试总结JavaScript篇
  • 前端之Sass/Scss实战笔记
  • 使用docker-compose进行多节点部署
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • ionic异常记录
  • kubernetes资源对象--ingress
  • 阿里云ACE认证之理解CDN技术
  • 阿里云重庆大学大数据训练营落地分享
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​水经微图Web1.5.0版即将上线
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #LLM入门|Prompt#3.3_存储_Memory
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (pytorch进阶之路)扩散概率模型
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (九)One-Wire总线-DS18B20