第7章 函数
分为标准库函数和自定义函数
函数有利于支持模块化程序设计
传值调用和传址调用
函数与数组
int a[][3] = {{1,2,3},{4,5,6}};
int *b = a;
可以通过指针操作二维数组
函数与指针
指向函数的指针
使用指向函数起始地址的指针变量,可以把函数作为实参传递给被调函数,因为函数名表示函数在内存地址中的首地址,这个地址就是函数被调用时的入口地址
1、表示方式
类型 (*指针变量名)(参数列表) 例如 int (*func)(int i, int j)
int是指返回类型,func是一个指针,指向一个函数,
2、使用方法
int get_max(int a, int b);
int get_min(int a, int b);
定义函数指针:int (*p)(int, int)
可以根据需求灵活决定p是指向那一个函数的指针
示例如下:

调用p,相当于把参数传递到p所指的函数中去
递归函数:利用堆栈技术完成
宏定义
# define MAX(a,b)(a>b)?a:b
# define ABS(x) (((x)>0)?(x):(-x))
# define SWAP(a, b) t=a;a=b;b=t;
撤销:#undef NAME
进行宏定义时,最好把整个表达式和各个参数括起来,以避免出现错误;
例如:# define EVEN(a) a%2==0?1:0
调用EVEN(9+1),输出奇数
原因:预处理时,EVEN(9+1)被9+1%2==0?1:0替换,得到错误结果
头文件
引用系统给的头文件 # include <name.h>
引用自定义的头文件 # include "name.h"
条件编译
1、#if ~ #endif

(1)MAX定义为10,所以#if后面一段不会被编译
(2)利用#if可以选择哪些代码被编译
2、#ifdef ~ #endif
预处理程序遇到#ifdef时,判断标识符是否被定义过,是则编译代码段1,不是则编译代码段2;

3、#ifndef ~ #endif
同上一个语句作用恰好相反

浙公网安备 33010602011771号