第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

同上一个语句作用恰好相反

posted @ 2021-03-06 01:14  头秃1997  阅读(55)  评论(0)    收藏  举报