C语言函数

C语言函数

函数的分类

  1. 库函数
    库函数又称系统定义的标准函数,是由编译器事先定义的,库文件中包括了对各函数的定义。不需要自己定义,只需要#include <头文件名>就可以使用
  2. 自定义函数
    如果想使用函数来实现自己的目的,而库函数无法达到。我们也可以自己定义函数来实现目的。

函数的定义方法

在程序中所有的函数都要先定义,再使用。库函数的定义在包含他的头文件中。所以自定义函数,要我们使用这个函数前先定义函数。根据函数的参数,函数可以分两种。

  1. 无参函数

类型名 函数名()
{
函数语句;
}

void printstar()
{
	printf("*********");
}

这就是一个无参函数的定义
2. 有参函数

类型名 函数名(形式参数列表)
{
函数语句;
}

int sum (int a,int b)
{
	int s;
	s=a+b;
	return s;
}

ok,这就是一个简单的有参函数的定义。

函数的调用

就是函数的使用,在定义完函数后,在程序中使用上面定义完的函数
函数名(实参)

  • 函数在调用时的参数为实际参数,简称:实参。在使用无参函数时,实参可以省略,但是“()”不可以省略。
  • 实参可是常量,变量或者表达式,实参要与形参保持类型一致,各实参中间用逗号分开。
lji(char* p)
{
	printf("%c\n", *p);
	p++;
	if (*p == '\0')
		p = 0;
		lji(p);
}
main()
{
	char arr[10] = { "abcd" };
	lji(arr);
	return 0;
}

可以看到有的函数有返回值,有的没有。这个要怎么判断需不需要返回值呢

int jl(int a)
{
	int b=a+1;
	return b;
}
main()
{
	int a=3;
	int b=jl(a);
}

可以先简单的认为,如果我们需要函数计算得到一个值的时候,我们就要在函数的定义最后加入return来让函数返回我们结果。

void li()
{
	printf("**********");
}
main()
{
	li();
}

在这个函数中我们的目的不是进行运算,所以就不需要return不需要返回值
当返回语句中类型跟函数类型不一样的话,以函数类型为准

float sum(int a,int b)
{
	return a+b;
}

函数类型为float,return语句中a+b类型为int,在返回时系统将自动把函数返回类型转换为函数类型float

函数的声明

如果在函数没有定义的时候,想要使用函数。可以在文件开头先进行函数声明。
int sum(int a,int b);
这就是函数声明的一般形式

#include <stdio.h>
int max(int a,int b);
main()
{
	int x,y;
	printf("请输入两个整数:\n");
	scanf("%d%d",&x,&y);
	printf("%d和%d的最大值为:%d",x,y,max(x,y));
}
int max(int a,int b)
{
	if(a>b)
	return a;
	return b;
}

如上面的程序,在我们使用max()函数时,我们还没对其进行定义,但是当我们在开始的时候,对max()函数进行了声明。我们就可以正常调用max()函数。当然,如果你想让max()真正起作用,还时要对其进行定义的。

函数的参数

函数的参数主要用于主调函数跟被调函数之间的数据传输
形参说明了被调函数使用时,需要多少数据,及什么类型的数据。
实参可以是常量,变量,表达式或者一个函数,类型必须与形参一致。

函数在未被调用时,不占据系统空间。在调用时,系统会给其创建一个临时空间,并把实参传输给形参。在c语言中数据只能实参传输给形参。也就是说在函数的临时空间中形参数值的改变影响不了实参。但可以利用指针来弥补这个问题,指针的使用后面会再提到。伏笔一下。

数组名当函数的参数时,除了注意实参与形参的类型一致外,还有因为数组名是数组的首地址,相当与一个指针,所以在函数中形参的地址也是实参的地址,相当于两者公用一个空间。因此,形参数组改变时,实参也会改变。

函数的递归调用

递归调用是指函数直接或者间接调用了自己。

int f()
{
	printf("hahaha");
	f();
}

这个函数在定义时调用了自己f(),这就是函数的递归,但是根据前面循环的知识,我们会发现这是一个死循环。这就是我们要注意的函数递归时,栈溢出的情况。栈就是存储函数的空间。
那么如何正确使用函数的递归呢?

函数递归的用法很简单,是拆分思想。假如我规定了函数H()可以计算8*n。那么我就可以将H(n)写成8+H(n-1),

int H(int n)
{
	return 8*n;
}
#include <stdio.h>
int H(int n)
{
	if (n == 0)
		return 0;
	else
		return 8 + H(n - 1);
	
}
int main()
{
	int a = 8;
	printf("%d", H(a));
}

把原来的8n分成8+8(n-1),再把8*(n-1)分成8+8*(n-2),最后分成8+8+8…分成了加法。这就是函数的递归,但是由此可见有的问题不适合用递归来解决,大家在使用递归时要好好甄别哦!

函数的生命

函数在被使用时,系统分配其临时空间,在结束使用后空间被返还系统。函数的生命结束。函数由定义组成,在没有定义时,想要使用函数,要先声明才可以使用。当函数的声明或者定义都存放在一个文件中,我们可以包含头文件,在程序中就可以正常使用头文件里包含的函数了。
#include <文件名>或者#include "文件名"
跟我们#include<stdio.h>一样

ok了

这就是本章的内容了,明天就是五一了,加号祝大家拥有一个快乐的假期。比心比心

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值