C语言中的函数

目录

1.函数是什么?

2.C语言中函数的分类:

2.1库函数

2.2自定义函数

3.函数的参数

3.1实际参数(实参):

3.2形式参数(形参):

4.函数的调用

4.1传值调用

4.2 传址调用

5. 函数的嵌套调用和链式访问

5.1 嵌套调用

5.2 链式访问

6. 函数的声明和定义

6.1 函数声明:

6.2 函数定义:

 7. 函数递归

7.1 什么是递归?

7.2 递归的两个必要条件

7.3 递归和迭代


1.函数是什么?

数学中我们常见到函数的概念。但是你了解C语言中的函数吗?

维基百科中对函数的定义:子程序

程序是由多个零件组合而成的,而函数就是这种“零件”的一个较小的单位。

· 在计算机科学中,子程序,是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。

· 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

2.C语言中函数的分类:

1.库函数

2.自定义函数

2.1库函数

由C语言提供的函数称为库函数。如:printf、scanf、puts 等等。

为什么会有库函数?

为了支持可移植性和提高程序的效率,C语言提供了一系列的库函数,方便程序员进行软件开发。

简单总结,C语言常用的库函数都有:

· IO函数

· 字符串操作函数

· 字符操作函数

· 内存操作函数

· 时间/日期函数

· 数学函数

· 其他库函数

注:

使用库函数时,必须包含#include对应的头文件。

2.2自定义函数

顾名思义,自定义函数就是我们自己设计的函数。自定义函数和库函数一样,有函数名、返回值类型和函数参数。

函数定义:

int max2 (int a, int b)

{

        return (a>b)?(a):(b);

}

int                   返回类型

max2              函数名

int a, int b       形参声明(函数参数)

{        }中的是函数体,函数体是复合语句。仅在某个函数中使用的变量,原则上应该在该函数中声明和使用。但要注意不能声明和形参同名的变量,否则会发生变量名冲突的错误。    

例:写一个函数找出两个整数中的较大值。

#include <stdio.h>
int Max(int a, int b)
{
	return (a > b) ? (a) : (b);
}
int main()
{
	int a = 10;
	int b = 20;
	int ret = Max(a, b);
	printf("%d\n", ret);
	return 0;
}

3.函数的参数

3.1实际参数(实参):

真实传给函数的参数,叫实参。

实参可以是:常量,变量,表达式,函数等。

无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传递给形参。

3.2形式参数(形参):

形参指函数名后括号中的变量,形参只有在函数被调用的过程中才实例化(分配内存单元)。形参在函数调用完成之后就自动销毁了。因此形参只在函数中有效。

注:形参在实例化之后其实相当于是实参的一份临时拷贝,故改变形参的值不会影响到实参。

4.函数的调用

例:

int Add(int x, int y)
{
	int sum = x + y;
	return sum;
}

#include <stdio.h>
int main()
{
	int x = 10;
	int y = 20;
	int sum = Add(x, y);
	printf("x与y的和等于:%d\n", sum);
	return 0;
}

执行过程:该程序中定义了两个函数Add和main。main函数是程序的入口。在main函数中调用了Add函数,将实参x与y的值分别传递给了形参x,y,在Add函数中完成x,y的相加,并将和返回给main函数中定义的sum,最后将和打印出来。

· 函数调用的形式是在函数名后面加上小括号。这个小括号称为函数调用运算符。使用函数调用运    算符的表达式就称为函数调用表达式

· 函数调用运算符括起来的是实参。实参不止一个时,使用逗号将其分隔开。

· 在被调用的函数一方,会生成用于形参的变量,并赋予其实参的值。

· 形参和实参可以同名,因为它们的作用域不同。

形参的初始化完成后,将执行函数体。程序流在遇到return语句,或者执行到函数体最后的大括号时,就会从该函数跳转到调用函数。

4.1传值调用

函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。

4.2 传址调用

· 传址调用是将函数外部创建的变量的内存地址传递给函数参数的一种调用函数的方式。

· 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

传址调用的实例:

//写一个函数,用来交换两个变量的值。
#include <stdio.h>
void Swap(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int x = 10;
	int y = 20;
	printf("交换之前x,y的值分别是:%d %d\n", x, y);
	Swap(&x, &y);
	printf("交换之后x,y的值分别是:%d %d\n", x, y);
	return 0;
}

5. 函数的嵌套调用和链式访问

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

5.1 嵌套调用

#include <stdio.h>
void new_line()
{
	printf("hehe\n");
}
void three_line()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		new_line();
	}
}
int main()
{
	three_line();
	return 0;
}

函数可以嵌套调用,但是不能嵌套定义,因为语法不支持。

5.2 链式访问

把一个函数的返回值作为另外一个函数的参数。

#include <stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 43)));
	//注:printf函数的返回值是打印在屏幕上的字符的个数。
	return 0;
}

6. 函数的声明和定义

6.1 函数声明:

1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。

2.函数的声明一般出现在函数的使用之前。要满足先声明后使用

3.函数的声明一般放在头文件中的。

6.2 函数定义:

函数的定义是指函数的具体实现,交代函数的功能实现。

test.h的内容        (头文件)

 放置函数的声明

//函数的声明

int Add(int x,  int y);

test.c的内容         (源文件)

放置函数的实现

#include "test.h"

//函数的实现

int Add(int x,  int y)

{

        return x+y;

}

 7. 函数递归

7.1 什么是递归?

程序调用自身的编程技巧称为递归。

递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题转化为一个与原问题相似规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式为:把大事化小

7.2 递归的两个必要条件

·  存在限制条件,当满足这个限制条件的时候,递归便不再继续。

·  每次递归调用之后越来越接近这个限制条件。

//以递归的方式求n的阶乘
#include <stdio.h>
int result(int n)
{
	if (n <= 1)
	{
		return 1;
	}
	else
	{
		return (n * result(n - 1));
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = result(n);
	printf("%d的阶乘是:%d\n", n, ret);
	return 0;
}

7.3 递归和迭代

递归是函数自身调用自己的,而迭代是通过重复执行的代码处理相似的数据集的过程,而循环是属于迭代的一种。

//以迭代的方式求n的阶乘
#include <stdio.h>
int result(int n)
{
	int i = 1;
	while (n > 1)
	{
		i *= n;
		n--;
	}
	return i;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = result(n);
	printf("%d的阶乘是:%d\n",n,ret );
	return 0;
}

提示:

1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时的开销。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值