c语言笔记-------函数

文章介绍了函数的基本概念,将其比喻为黑匣子,强调了其通过参数实现特定功能和模块化编程的重要性。函数分为系统函数和自定义函数,调用时会暂停当前执行并占用栈空间。文章还提到了局部变量、全局变量和参数的作用域及生命周期,并给出了函数封装的示例。此外,讨论了主函数的参数传递和递归函数的调用原理,以及栈溢出可能导致的问题。
摘要由CSDN通过智能技术生成

===函数的概念
函数就像一个黑匣子,只需要知道输入的啥,输出的啥就可以了。
本质上就是把一堆代码打包起来,实现某个功能

特点:
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.函数调用会占用内存(栈空间),不能无限调用 
	 栈空间是有限的,可能会造成栈溢出,出现段错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值