导图社区 用函数实现模块化程序设计
针对C程序设计中函数部分进行的基础知识总结
下图对于数据链路层的知识总结,包括数据链路层相关基本概念、以太网相关技术、相关协议等内容,有需要的朋友收藏学习吧!
对高等代数中线性方程组解的总结(包含:Cramer定则和一般线性方程组有解的相关定理
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
用函数实现模块化程序设计
定义函数
包括内容
指定函数的名字
指定函数的类型(即函数返回值的类型,如:void)
指定函数的参数的名字和类型(对无参函数不用)
指定函数应当完成的操作(即函数的功能,在函数体中解决)
定义函数的方法
定义无参函数
类型名 函数名(){函数体}
类型名 函数名(void){函数体}
定义有参函数
类型名 函数名(形式参数表列:类型名 参数名,){函数体}
定义空函数
类型名 函数名(){}
函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义
调用函数
一般形式
函数名(实参表列:函数名,)
1、调用无参函数,可以没有“实参表列”,但括号不可省: 2、可以是常量、变量、表达式,但必须是确定的值 3、实参与形参的类型应相同或赋值兼容
调用方式
调用函数语句:把函数调用单独作为一个语句
函数表达式:函数调用出现在另一个表达式中
函数参数:函数调用作为另一个函数调用时的实参——例:m=max(a,max(b,c)); 又例:printf("%d",max(a,b));
函数的返回值
函数的返回值通过函数中的return语句获得
1、一个函数中可以有多个return语句,执行到哪个return语句,哪个就起作用 2、return z;与return (z);等价 3、return后面的值可以是一个表达式
函数类型决定返回值类型
1、在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致 2、并不是所有的类型都能互相转换 3、类型转换是按赋值规则处理的
对于不带回值的函数,应当用定义函数为“void类型”(或称“空类型”)
1、保证不使函数带回任何值,即禁止在调用函数中使用被调用函数的返回值 2、此时在函数体中不得出现return语句
对被调函数的声明和函数原型
函数原型:函数的首行(即函数首部)
函数声明的形式
用函数原型来声明函数
省略形参名,而只写形参类型
形参名取更能知道含义的(与函数原型中的形参名可以不一样)
函数声明的位置
调用函数中的开头位置
文件的开头(所有函数前面的外部)
函数的嵌套使用
没直接调用函数不必做声名
函数的递归调用
函数的递归调用:在调用一个函数的过程中又直接或间接地调用该函数本身
一个递归问题可以分为“回溯”和“递推”两个阶段
用if语句来控制是否停止递归
数组作为函数参数
数组元素作函数实参
只可以用作函数实参
是“值传递”,数据传递方向是从实参到形参,单向传递
int main(){ int max(int x,int y); int a[10],m,i; for (){m=max(m,a[i]);} } int max(int x,int y){ return(...);}
一维数组名作函数参数
可以用数组名作函数的实参和形参
C语言编译系统不检查形参数组大小
形参数组可以不指定大小,如:float f(float array[]){}
用同一个函数对两个不同长度的数组进行操作,可以增加整型变量i实现对数组长度(或函数中循环次数)的控制,如:float f(float array[],int i){}
用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址; 形参数组首元素和实参数组首元素具有同一地址,共占同一存储单元; 形参数组中各元素的值如发生变化会使实参数组元素的值同时发生变化。
多维数组名作函数参数
形参数组第1维的大小可以省略或与实参数组第1维大小不同, 但,第2维以及其他高维的大小不能省略,且要和实参数组的对应维的大小相同, 从而保证实参和形参对应部分具有相同的起始地址,进而保证实参元素和形参元素能一一对应地同占一个存储单元,具有同一个值
内部函数和外部函数
函数在本质上是外部的
内部函数(静态函数)
只能被本文件中其他函数调用
static 类型名 函数名(形参表)
保证在不同文件中即使有同名的内部函数,也不互相干扰
外部函数
extern 类型名 函数名(形参表)
声明外部函数时可以省写extern
在#include指令所指定的“头文件”中包含了函数的原型和其他相关信息