第三节.函数

1、函数?

  1. 是一个子程序
  2. 相较于其他代码具有独立性
  3. 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏,这些代码通常被集成为软件库

函数的分类: 库函数   自定义函数

1.1 定义函数

类型 函数名( 形参(变量) )
{
   返回值;
}

在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:

  • 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
  • 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) 
{
   
   int result;
 
   if (num1 > num2) {
      result = num1;
   } else {
      result = num2;
   }
   return result; 
}

1.2 函数参数

两种参数名字可以相同可以不同

实际参数 实参

真实传递给函数的参数叫实参。
实参可以是:常量,变量,表达式,函数等
无论是实参是何种类型的量,在进行函数调用时,都必须有确定的值,以便把这些值都传递给形参。

 形式参数 形参

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元)
所以叫形式参数,形式参数只在函数范围内有效,出函数销毁。
形参实例化后是实参的一份临时拷贝。

 1.3 函数声明 

 如果函数定义没在主函数之前,必须要在主函数前声明函数,即是要告诉编译器函数已在别的地方定义过了。

一个函数只能被定义一次,但可以声明很多次。

#include<stdio.h>
exteren void Judge(int x);

int main()
{
	int j = 100;
	for (j = 100; j <= 200; j++)
		Judge(j);
	return 0;
}
void Judge(int x)
{
	int i;
	int flag = 0;
	for (i = 2; i < x; i++)
	{
		if (x % i == 0)
		{
			printf("%d不是素数\n", x);
			flag = 0;
			break;
 
		}
		else
		{
			flag = 1;
			break;
		}
	}
	if (1 == flag)
	{
		printf("%d是素数\n", x);
	}
}

1.4 返回值 

 带返回值的函数:

在定义函数时,必须带返回值类型,在函数体里必须有return,若没有返回值,默认返回整型。

注: return后面的语句不会被执行。

无返回值类型函数:

在定义函数时,在函数名前加void

注:在定义函数时,不允许出现函数嵌套,函数定义应该在同一层次。 

 1.5 调用函数

当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。

 传值调用:

 函数的实参和形参分别占有不同的内存块地址并不相同。

传址调用:
把函数外部创建变量的内存地址传递给函数参数。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

 1.6 全局变量和局部变量

局部变量:定义在函数内的变量
局部变量使用前如果没有初始化,会报错。

只在函数体内可用,离开函数后,会自动释放。

 全局变量:定义在函数外的变量

全局变量在使用前,如果没有初始化,会默认初始化为0。

整个程序可用

定义多个全局变量,会造成内存泄漏,要避免定义多个全局变量

 1.7 函数递归

有规律的·:核心:大事化小

#include<stdio.h>
void print(unsigned int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	print(a);
	return 0;
}

1234 拆分成 123 每一位 + 打印4
123   拆分成12的每一位  + 打印3
12     拆分成1                  + 打印2

 注!!!

递归的必要条件:

递归一定要写限制条件。否则会栈溢出 
每次递归调用之后越来越接近这个限制条件,如果次数过多也会导致栈溢出。
如果递归次数太多,太深,容易出现栈溢出的形式
解决办法:

递归改成非递归
静态变量改为static对象,将栈上的静态变量改为存在静态区上的static变量

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值