一、函数基本概念
模块化·重构,函数与模块是同义词
函数(function)的意义:对一段流程结构的封装
函数有三种状态,分别是声明状态、调用状态、定义状态。正常来讲,在设计一个函数的过程,先声明,再调用最后再定义。
声明状态一般放在main函数外面,也就是全局位置。
将判断能否结婚的流程进行模块化重构:
#include <stdio.h>
void 判断结婚(int sex, int age);//声明
int main()
{
/*重构基本思想*/
/*函数(function)的意义:对一段流程结构的封装*/
int age = 21;
int sex = 0;
判断结婚(sex, age);//调用
/*函数的基本结构*/
return 0;
}
void 判断结婚(int sex, int age)//定义
{
if (sex)
{
if (age >= 22)
{
printf("男的 能\n");
}
else
{
printf("男的 不能\n");
}
}
else
{
if (age >= 20)
{
printf("女的 能\n");
}
else
{
printf("女的 不能\n");
}
}
}
在函数中的参数为形参。
二、函数之间数据传递
函数的执行原理:调用时执行,执行完消失,也就是从栈中弹出(pop)
函数的数据(值)传递为:copy(复制)方式
数据之间的传递的类型为传值和传址
调用 传值:传值不可以改变主函数中的数据。
exchange(m, n);//调用 传值
void exchange(int m,int n)//定义 void 空·无 无类型占位符
{
int t;
t = m; m = n; n = t;
return;
}
传址 形象的数就是把变量传过去了 地址相对来说是跨区域的(也就是不是局部变量):传址可以通过对地址的操作改变主函数中的数据,因为地址相当于是面向全局的。
swap(&m, &n);
void swap(int*m,int *n)
{
int t;
t = *m; *m = *n; *n = t;
}
看如下代码,这其中的int a[]其实是给调用者的暗示 实际上是个指针 并且[]中的长度无意义,所以要通过传参的方式将长度传进来。
int add_all(int a[] ,int len);
void 是指空·无 无类型占位符,可以出现在函数的声明和定义中。
return 关键词的意思就是结束并返回值,如果打算中途结束函数执行,return需要与if结合使用。在满足某条件时结束函数执行。 如果返回类型不是void 则函数结束必须返回定义函数的类型。