目录
一、函数
1.1 函数概述
组成:函数是程序最基本的组成单元,是指完成特定功能的程序代码
主次:主函数、子函数
分类:库函数(API函数)、自定义函数
1.2 函数特性
独立性:函数与函数之间彼此独立
模块化:一个函数封装成一个函数
通用性:函数不是为了解决一个问题,而是为了解决一类问题
1.3 字符串标准库函数 <string.h>
字符串长度计算函数(strlen)
字符串对比函数(strcmp)
字符串拼接函数(strcat)
字符串复制函数(strcpy)
1.4 数学标准库函数<math.h>
计算绝对值函数(abs)
计算次方值函数(pow)
计算平方根函数(sqrt)
余弦函数值计算函数(cos)
正弦函数值计算函数(sin)
二、函数应用
2.1 函数组成
函数三要素:函数定义、函数声明、函数调用
2.2 函数模型
格式:函数类型 函数名(形参)
{
函数代码;
}
函数类型:返回值的数据类型
形参:详称为形式参数,是外部参数传给函数的入口
一个函数有函数类型,那么这个数必须有返回值
一个函数有形参,那么这个函数在调用的时候必须有实参向形参传递数据
例:使用函数实现判断153是否是水仙花数
#include<stdio.h>
int Shui_XianHua(int a,int b,int c);
int main()
{
int num,a,b,c;
printf("输入数字:");
scanf("%d",&num);
a=num/100;
b=num%100/10;
c=num%10;
if(Shui_XianHua(a,b,c)==1)
{
printf("%d%d%d是水仙花数\n",a,b,c);
}
else
{
printf("%d%d%d不是水仙花数\n",a,b,c);
}
}
int Shui_XianHua(int a,int b,int c)
{
int flag;
if(a*a*a+b*b*b+c*c*c==a*100+b*10+c)
{
return 1;
}
else{
return 0;
}
}
练习:使用子函数编写一个200~400之间不能被3整除的数
//1.无返回值,无形式参数
#include<stdio.h>
int sum();
int main()
{
sum();
}
void sum()
{
int i,s=0;
for(i=200;i<=400;i++)
{
if(i%3!=0)
{
s+=i;
}
}
printf("和为:%d\n",s);
}
//2.有返回值,无形式参数
#include<stdio.h>
int sum();
int main()
{
printf("和为:%d\n",sum());
}
int sum()
{
int i,s=0;
for(i=200;i<=400;i++)
{
if(i%3!=0)
{
s+=i;
}
}
return s;
}
//3.有返回值,有形式参数
#include<stdio.h>
int sum(int a,int b,int c);
int main()
{
int a,b,c;
printf("输入范围最大值、最小值、除数\n");
scanf("%d%d%d",&a,&b,&c);
printf("和为:%d\n",sum(a,b,c));
}
int sum(int a,int b,int c)
{
int i,s=0;
for(i=a;i<=b;i++)
{
if(i%c!=0)
{
s+=i;
}
}
return s;
}
三、函数和变量的作用范围
3.1 函数作用范围
3.1.1 全局函数
全局函数是指这个函数能被工程任意源文件(.c)所调用。
3.1.2 局部函数
局部函数是指这个函数只能被所在的源文件使用。
函数前加extern表示函数为全局函数,加static表示为局部函数,二者都不加则默认为全局函数。
3.2 变量作用范围
3.2.1 全局变量
全局变量是指在函数体外面定义的变量,若不赋值则全局变量的初始值为0。
作用时间:从定义变量开始一直到程序结束
作用范围:整个工程
3.2.2 局部变量
局部变量是指在函数内定义的变量
作用时间:函数开始到函数结束
作用范围:函数内部
#include <stdio.h>
int c; //全局变量
int a = 20;
void fun()
{
static int a = 0;
//静态变量:有着全局变量的生命周期和局部变量的作用范围
int b = 0;
b++;
a++;
c++;
printf("%d ",a);// 1 2 3
printf("%d ",b);// 1 1 1
printf("%d\n",c);// 1 2 3
}
int main()
{
fun();
printf("\n");
fun();
printf("\n");
fun();
printf("\n");
printf("a = %d\n",a);
}
3.2.3 静态局部变量
静态局部变量是局部变量的特殊例子 static int a;
作用时间:从定义变量开始一直到程序结束
作用范围:函数内部
四、递归函数
在函数内部中,自己调用自己的函数称为递归函数
例:有一对兔子,从出生后第3个月开始,每一个月生一对兔子,新生的小兔子在长到第3个月开始每个月又生一对兔子,假如兔子不死,问每个月的兔子总数是多少。
#include<stdio.h>
int jie(int n);
int main()
{
int a;
printf("输入月份:");
scanf("%d",&a);
printf("%d的兔子总数为:%d",a,jie(a));
}
int jie(int n)
{
int sum;
if(n>2)
{
sum=jie(n-1)+jie(n-2);
}
else
{
sum=1;
}
return sum;
}
五、C语言开辟内存的五大区域
5.1 栈区
在执行函数时,函数(包括main函数)内局部变量以及函数的形参的存储单元空间都是在栈区中创建,栈区中的变量控制由编译器自动开辟和在函数运行结束之后自动释放。
5.2 堆区
堆区也称动态内存分配区。堆区的空间程序在运行的时候由程序员使用“malloc”函数去申请任意大小的内存空间,空间一旦申请完成,需要程序员自己负责在适当的时候使用“free”函数去释放内存,如果开辟后没有进行释放,到整个工程结束后自动释放。
5.3 全局变量区
全局变量区也称为全局/静态区,主要是存放全局变量和静态变量。全局变量区中的变量由编译器自动开辟和当整个工程结束之后自动释放。
5.4 常量区
常量区是一块比较特殊的数据存储区,在程序运行的过程中,只允许程序去访问,不允许程序进行修改(只读)。常量区主要存放的是文字常量。
5.5 程序代码区
程序代码区主要是用于存放二进制代码。