函数
1.函数的基本概念
函数是把代码中功能相似并且独立的代码单独封装称一个独立的整体;
(1)函数的优点
提高代码的简洁性,提高开发效率
提高代码的重用性
有利于程序的维护
(2)函数的分类
分类一:
系统函数
由C系统提供的函数;如:printf(),scanf(),gets(),puts()
调用系统函数时,只需要将其对应的头文件夹包含进来即可
#include<stdio.h>----->printf("hello!");
powa,b)------>计算a的b次方
toupper------->小写字母转大写字母
tolower------->大写字母转小写字母
自定义函数:
用户根据需要自己定义的 函数
分类二:
有返回值函数:
函数调用结束后,会返回一个数值给主调函数;
无返回值函数:
函数调用结束后,没有返回值,一般定义为void类型,即空类型。
分类三:
有参函数:
参数可以任意多个
无参函数
2.函数的基本定义:
(1)无参函数的定义
DataType FunctionName()
{
//函数体
//可执行语句
}
注:函数名后的括号不可以省略!!!
(2)有参函数的定义
DataType FunctionName(Type arg1,Type arg2)
{
//函数体
}
注:参数列表可以有多个,参数的类型可以任意(相对)
(3)函数的定义,函数的声明以及函数的调用
函数的定义
DataType FunctionName(参数列表)
{
//函数体
}
函数的声明:
DataType FunctionName(参数列表)
注:声明时,参数列表一定要和定义时的参数列表一致!!
main函数在自定义函数之后可以不要声明。
函数的调用:
FunctionName(value);
value:数值
注:函数调用实参的值的类型,一定要和函数定义时的形参列表一致!
函数调用可以在任何位置。
实参:实际参数,即具体的数值
形参:形式参数,
注:函数名表示函数的入口地址。
函数之间是等价的,没有优先级问题。即平行关系!
形参在发生调用时分配空间!
在发生函数调用时,系统会默认将实参的值赋给形参!
3.函数的返回值
无返回值的类型函数类型为:void
DataType FuncName(参数列表)
{
//函数体
}
DataType:决定了函数返回值的类型,若是int。则函数返回值为int型
若为double,则函数返回值为double型
如果函数的返回值能够在后面的程序中使用,则需要相同类型的变量接收返回值
若是void类型函数,则无返回值,return可有可无
若函数不是void类型,则必须要有return!!!
4.return的作用
(1)函数遇到return则结束,后面的代码不再执行
(2)用于返回函数的值,即返回结果
5.关键字
(1)变量分为全局变量和局部变量
全局变量:在函数外定义的变量
其作用域是从变量定义处开始,一直到本文件结束,定义之前不可使用
局部变量:在函数内定义的变量,其作用域是整个函数!
函数结束时,局部变量会释放,因此,不同的函数中可以使用相同的变量名
若局部变量与全局变量重名,则自动屏蔽全局变量
auto:声明动态变量,可以省略
如:(auto) int a = 0;
动态全局变量
作用域:从定义出开始,到文件末
生命周期:整个程序运行期间
动态局部变量
生命周期:仅限于定义的函数中
static:声明变量为静态变量;
作用域:从定义初开始,到文件结束
生命周期:整个程序运行期间
静态变量若定义时没有初始化,则系统默认初始化为0
静态变量只初始化一次!!!
静态函数:static修饰函数,则此函数只能用于本文件
extern:声明为外部变量:extern int sum;
修饰函数:extern int test();
声明变量或函数在外部已经定义。
register:寄存器变量:变量直接存放在寄存器中,
CPU的寄存器个数有限,不可以定义多个寄存器变量
优点:速度快!!
const:常量,不可更改其值,相当于只读变量。
const int num = 5;
int const num = 5; 两者意义相同
const int *p;
int const *p; //指针值不可改变
int* const p; //指针的地址不可改变
const int* const p; //指针的值跟地址都不可改变
6.函数的传参
传值:仅仅是对值的操作,并没有改变变量地址里的内容
传址:对地址操作,修改变量对应地址的内容
7.指针函数和函数指针
指针函数:
int *test();
返回一个局部地址是不允许的,没有意义
注意返回值问题,返回的是一个地址!!!
函数指针:
int (*pa)();
指针的类型:int (*)()
总结
函数在我看来就是把程序模块化,把需要不同功能的地方单个提取出来并加以修饰,让它适用范围更广,提高后面编程的效率。
在使用函数的时候要注意函数的传参跟传址,当然大部分情况下传址的适用性跟广一点。
还有注意函数返回值的类型以及函数的应用,形参跟实参一定要一一对应,并且保持类型的一致
而且每个函数中几乎都有局部变量。注意局部变量的生命周期,不要乱用,并分清局部变量跟全局变量的区别。