函数的优点:
使程序变得更简短而清晰
有利于程序维护
可以提高程序开发的效率
提高了代码的重用性
内置函数:
由C语言系统提供;
用户无须定义,也不必在程序中作类型说明;
只需在程序前包含有该函数定义的头文件;
自定义函数:
用户在程序中根据需要而编写的函数;
C 语言中的 return 语句用于向调用函数返回值,语法如下:
return (<表达式>);
C语言中的函数至多可以返回一个值,不能返回多个值;
返回值的数据类型必须与函数原型中返回值的数据类型匹配;
当遇到 return 语句时,函数执行将终止。程序控制流将立即返回调用函数;
函数的传值调用
函数的传值调用中,分为传递实参数据值的传值调用和传递实参变量地址的传址调用.
(1)、传值调用方式
A、这种调用方式是将实参的数据传递给形参,即将实参值拷贝一个副本存放在被调用函数的栈区中.
B、在被调函数中,改变了形参的值而不影响调用函数实参值.
(2)、传址调用方式(指针或数组名:一维与二维数组名)
A、这种调用方式是将实参变量的地址传递给形参,这时形参应是指针.即让形参指针指向实参地址.
B、于是,这就提供了一种可以改变实参变量的值的方法:在被调函数中改变形参所指向的变量值.
数组作为函数参数
在用数组作实参时,以传址方式调用函数,也就是说把实参数组的首地址赋给形参
实际上形参数组和实参数组为同一数组,共同拥有一段内存空间
函数指针
1.一个函数在编译时,有一个入口地址,即该函数的指针
2.函数指针的定义:
数据类型 (* 指针变量名) (函数参数表)
如: int (*p) (int, int)
3.函数指针的值就是指针所指向的函数的返回值
4.函数指针赋值: 指针变量名 = 函数名
如: p=max;
5.函数指针引用: (* 指针变量名) (函数参数表)
如: (*p)(a, b) 或 p(a,b)
注: 不能省略*p两端的括号
函数指针说明:
(1)函数的调用可以通过函数名,也可以通过函数指针调用
(2) int (*p) ( int , int )仅仅定义了一个指针,它可以指向不同的函数,只要该函数返回一个整型数据,且有两个整型参数
(3)在给函数指针赋值时,只需给出函数名,而不必给出参数
(4)用函数指针调用函数时,只需(*p)(a, b),即用*p代替函数名
(5) 对于函数指针, p+n、p++、p-- 无意义
用指向函数的指针作函数参数
目的:能够调用由参数传过来的函数
功能: 调用同一函数,根据参数的不同,实现不同的功能
如: void sub( int (*x1)(int), int (*x2)(int, int))
返回指针值的函数——指针函数
指针函数:返回指针值的函数,即函数的返回值是一个指针
定义形式:类型名 *函数名(参数列表)
eg: int *a(int x, int y)
指向指针的指针
指针的指针:指针值还是指针的变量类型
定义格式:int **p;
**p是一个整型变量值
*p是一个指向整型变量指针
p是一个指向整型变量的指针的指针
命令行参数
main函数也是可以有参数的。(UNIX和MS-DOS)
格式:void main(int argc, char *argv[ ] )
main函数由操作系统调用,在命令中, 输入main所在的文件名(经过编译链接得到的可执行文件)
参数argc是指命令行参数的个数(包括可执行文件名)
参数*argv[ ]是一个指针数组,数组元素分别是输入参数的首地址
局部变量: 定义在函数内部的变量
生存期: 变量定义→所在函数结束
作用域: 只能在定义函数内部被访问
静态局部变量:
生存期: 程序开始→程序结束
作用域: 只能在定义函数内部被访问
应用场合: 统计数据
全局变量:
生存期: 程序开始→程序结束
作用域: 所有.c文件都可以访问
项目中谨慎使用
静态全局变量:
生存期: 程序开始---->程序结束
作用域: 只能被本.c文件访问