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.防止头文件重复包含在头文件里

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

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值