===函数的概念
函数就像一个黑匣子,只需要知道输入的啥,输出的啥就可以了。
本质上就是把一堆代码打包起来,实现某个功能
特点:
1.通过特定的函数传参,函数可以实现相应的功能,可以返回一个数值,作为返回值
2.模块化编程。(函数封装的思想,很重要!!!!)
分类:
1.系统函数、库函数(不需要编写)
系统函数就是linux系统提供的
库函数 由各种库提供的 printf 由 标准c库提供
不需要自己封装,只需要知道怎么使用就可以了
2.自己编写的函数 自定义函数
1.main函数
只能编写内容,不能改名字
C语言程序固定的入口
2.子函数 ---功能函数
完全由程序员自己编写封装,自定义函数名 参数 执行代码 返回值等
函数的调用原理
1.函数调用会在调用的位置暂停
2.调用时,实际上就是去执行函数中的代码
3.函数结束时,会回到调用位置
4.函数调用会占用内存(栈空间),不能无限调用
栈空间是有限的,可能会造成栈溢出,出现段错误
=封装子函数==========
例子:
计算两个整数的和
/*
功能:计算两个整数的和
参数:两个整数
返回值: 计算的结果–两个整数的和
*/
void sum(int a, int b)//int 函数的返回值类型 sum 函数名 (int a, int b) 参数列表
{
int c;
c = a+b;//c=3+2
return c;//返回值
}
int main()
{
int m =2, n=3;
int num;
num = sum(n,m);//实际传递的是值 num 接收返回值
printf("num %d\n",num);
}
补充:
1.封装函数时需要添加注释(功能 参数 返回值)
方便调用
2.函数头--返回值类型
int 返回值类型 要和 return 后面数据类型保持一致
void 代表没有返回值 return 可写可不写 ,如果要使用return的话,后面就不要有数据
void * 返回值是通用型(任意)指针,使用时得进行强转
3.函数名
1.根据函数的功能命名
2.符合命名规则
3.函数名就是函数的入口
4.(int a, int b) 参数(形参)列表
实参:调用函数时传递的具体的数据
调用函数时,实参要和形参在 数量 类型 位置上保持完全一致
练习
1. 查找资料,了解什么是参数 局部变量 全局变量以及他们的作用域和生命周期
1.局部变量
就是函数内部的变量
作用域:函数内部,变量定义位置的以下区域
生命周期:从定义出来到函数结束
2.全局变量
就是在函数外部定义的变量
作用域: 变量定义位置的以下区域(包含 在多个函数内部使用)
生命周期: 从定义出来到程序结束
3.参数
本质上就是局部变量
作用域:函数内部,变量定义位置的以下区域
生命周期:从定义出来到函数结束
2.封装函数实现计算两个整数的积
3.把昨天的作业第2题的打印字母金字塔功能封装成函数
main函数—主函数传参==========
1.可以没有参数
int main()
{
return 0;
}
int main(void)
{
return 0;
}
2.有参数
int main(int argc, char **argv)
int main(int argc, char *argv[])
int main(int argc, char argv[][20]) //有一定的局限性
argc : 参数的总数量 (包含 ./a.out)
argv : 参数的内容
argv[0] 第0个参数
argv[1] 第1个参数
argv[2] 第2个参数
。。。。。。。
gec@ubuntu:/mnt/hgfs/share$ ./a.out abc 123
argc 3
argv[0] ./a.out
argv[1] abc
argv[2] 123
补充:
1. argc 判断运行程序是的参数数量是否复合要求
./a.out 123456
./a.out
2. argv 指定运行程序时需要的特殊数据
比如 : ./a.out 192.168.1.123 12345
3. 也可以指定运行程序时的一些其他数据
./a.out 10 20
注意 :传进来的数据实际上都是字符型,如果想要当成整型数据使用的话
"10"---> 10
解决方法 : atoi()
#include <stdlib.h>
int atoi(const char *nptr);
int a = atoi(argv[1])
练习
1.实现输出打印任意个数的主函数传来的参数
2.给应用程序加密
要求:用户运行程序时,必须输入密码并且密码正确 123456,才能进入程序
1.
./a.out 123456 正确密码
打印 WELCOME TO THIS SYSTEM
2.
./a.out 5465482 错误密码
打印 ERROR 密码错误
3.
./a.out 5465 482 密码过多
打印 ERROR 密码过多
4.
./a.out
提示 ERROR 请输入密码
=递归函数====
就是自己调用自己,设置一个结束的条件
int fun()
{
//结束的条件
。。。。
fun();
。。。。
}
int main()
{
fun();
}
函数的调用原理
1.函数调用会在调用的位置暂停
2.调用时,实际上就是去执行函数中的代码
3.函数结束时,会回到调用位置
4.函数调用会占用内存(栈空间),不能无限调用
栈空间是有限的,可能会造成栈溢出,出现段错误