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