第九章 函数

本文详细介绍了C语言中的函数,包括函数的概述、定义、返回语句、参数、调用方式,以及内部函数和外部函数的区别。重点讲解了函数参数的传递,如形式参数与实际参数、数组作为函数参数的传递方式,还探讨了递归调用和局部变量与全局变量的概念。文章还列举了常用的数学函数、字符处理函数的使用方法。
摘要由CSDN通过智能技术生成

一、函数概述

构成 C语言的基本单元是函数。函数中包含程序的可执行代码。

每个 C 程序的入口和出口都位于 main 函数之中。为了方便规划、组织、编写和调试,一般的做法是将一个程序划分成若干个程序模块,每一个程序模块都完成一部分功能。这样,不同的程序模块可以由不同的人来完成,从而可以提高软件的开发效率。

主函数可以调用其他函数,其他函数也可以相互调用,在 main 函数中调用其他函数,这些函数执行完毕之后又返回到 main 函数中。通常把这些被调用的函数称为下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待状态,直到被调用函数执行完毕。函数可以有参数和返回值。

#include<stdio.h>

void Move();				/*声明搬运函数*/
void Build();				/*声明建造函数*/
void Paint();				/*声明粉刷函数*/

int main()
{
	Move();					/*执行搬运函数*/
	Build();				/*执行建造函数*/
	Paint();				/*执行粉刷函数*/

	return 0;
}

/*/*/
/*								执行搬用功能				  		      */
/**/
void Move()
{
	printf("This Function can move material\n");
}
/**/
/*                             执行建造功能                              */
/*// */
void Build()
{
	printf("This Function can build a buillding\n");
}
/*///*/
/*                             执行粉刷功能                             */
/*//*/
void Paint()
{
	printf("This Function can paint cloth\n");
}

①一个源文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。

②库函数由 C语言系统提供,用户无需定义,在调用函数之前也不必在程序中做类型说明,只需要在程序前包含有该函数原型的头文件,即可在程序中直接调用。

③用户自定义函数,就是用户自己编写的用来实现特定功能的函数。

④在这个程序中,要使用 printf 函数首先要包含 stdio.h 头文件,然后声明 3 个自定义的函数。最后在主函数 main 中调用这 3 个函数,在主函数 main 外可以看到这 3 个函数的定义。

二、函数的定义

函数的定义是让编译器知道函数的功能。定义的函数包括函数头和函数体两部分。

1、函数头

函数头分为 3 部分

①返回值类型。返回值可以是某个 C 数据类型。

②函数名。函数名也就是函数的标识符,函数名在程序中必须是惟一的。因为是标识符,所以函数名也要遵守标识符命名规则。

③参数表。参数表可以没有变量也可以有多个变量,在进行函数调用时,实际参数将被复制到这些变量中。

2、函数体

函数体包括局部变量声明和函数的可执行代码。

前面最常提到的 main 函数介绍。

所有的 C 程序都必须有一个 main 函数。该函数已经由系统声明过了,在程序中只需要定义一下即可。main 函数的返回值为整型,可以有两个参数,一个是整数,一个是指向字符数组的指针。虽然在调用时有参数传递给 main 函数,但定义 main 函数时可以不带任何参数,除了 main 函数外,其他函数在定义和调用时,参数必须是匹配的

1、函数定义的形式

一个函数的定义分为函数头和函数体两个部分。函数定义的语法格式如下:

返回值类型 函数名(参数列表)
{
    函数体(函数实现特定功能的过程);
}

定义一个函数的代码如下:

int AddTwoNumber(int iNum1,int iNum2)            /*函数头部分*/
{
    /*函数体部分,实现函数的功能*/
    int result;                            /*定义整型变量*/
    result=iNum1+iNum2;                    /*进行加法操作*/
    return result;                         /*返回操作结果,结束*/
}

 通过代码分析一下定义函数的过程。

1、函数头

函数头用来标志一个函数代码的开始,这是一个函数的入口处。函数头分成返回值类型、函数名和参数列表 3 个部分

int(返回值类型)

AddTwoNumber(函数名)

(int iNum1,int iNum2)(参数列表)

2、函数体

函数体位于函数头下方位置,由一对大括号括起来,大括号决定了函数体的范围。函数要实现的特定功能,都是在函数体部分通过代码语句完成完成的,最后通过 return 语句返回实现的结果。

①无参函数

无参函数就是没有参数的函数。语法格式如下:

返回值类型 函数名()
{
    函数体
}

通过代码来看无参函数。

void ShowTime()                /*函数头*/
{
    printf("it's time to show yourself!");                /*显示一条信息*/
}

 ②空函数

没有任何内容的函数,用来占一个位置,以后用一个编好的函数来取代它。

类型说明符 函数名()
{
}

例如,定义一个空函数,留一个位置以后再添加其中的功能。

void ShowTime()                /*函数头*/
{
}

2、定义与声明

在程序中编写函数时,要求对函数进行声明,再对函数进行定义。函数的声明是让编译器知道函数的名称、参数、返回值类型等信息。函数的定义是让编译器知道函数的功能。

函数声明的格式由函数返回值类型、函数名、参数列表和分号 4 部分组合,其形式如下:

返回值类型 函数名(参数列表);

必须要用分号 “;” 作为语句的结尾 

int ShowNumber(int iNumber);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

/*函数的声明*/
void ShowNumber(int iNumber);
int main()
{
	int iShowNumber;			/*定义整型变量*/
	printf("What Number do you wanna show?\n");			/*输出提示信息*/
	scanf("%d", &iShowNumber);							/*输入整数*/
	ShowNumber(iShowNumber);							/*调用函数*/
	return 0;
}

/*函数定义*/
void ShowNumber(int iNumber)
{
	printf("You wanna to show the Number is:%d\n", iNumber);		/*输出整数*/
}

 ①在 main 函数的开头进行了 ShowNumber 函数的声明,声明的作用是告知其函数将在后面进行定义。

②在 main 函数体中,首先定义一个整型的变量 iShowNumber ,之后输出一条提示消息。

③在消息提示下输入整型变量,最后调用 ShowNumber 函数进行输出操作,最后在 main 函数的定义之后就可以看到 ShowNumber 函数的定义。

如果将函数的定义放在调用函数之前,就不需要进行函数的声明。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

/*函数的定义*/
void ShowNumber(int iNumber)
{
	printf("You wanna to show the Number is:%d\n", iNumber);		/*输出整数*/
}
int main()
{
	int iShowNumber;			/*定义整型变量*/
	printf("What Number do you wanna show?\n");			/*输出提示信息*/
	scanf("%d", &iShowNumber);							/*输入整数*/
	ShowNumber(iShowNumber);							/*调用函数*/
	return 0;
}

三、返回语句

return 0;

这就是返回语句,返回语句有以下两个主要用途:

①利用返回语句能立即从所在的函数中退出,即返回到调用的程序中去。

②返回值能返回值,即将函数值赋给调用的表达式中。有些函数也可以没有返回值,例如,返回值类型为 void 的函数就没有返回值。

1、从函数返回

从函数返回是返回语句的第一个主要用途。在程序中,由两种方式可以终止函数的执行,并返回到调用函数的位置。第一种方法是在函数体中,从第一句一直执行到最后一句,当所有语句都执行完,程序遇到结束符号 “}” 后返回。

#include<stdio.h>

int Function();						/*声明函数*/

int main()
{
	printf("this step is before the Function\n");				/*输出提示信息*/
	Function();													/*调用函数*/
	printf("this step is end of the Function\n");				/*输出提示信息*/
}

int Function()					/*定义函数*/
{
	printf("this step is in the Function\n");				/*输出提示信息*/
	/*函数结束*/
}

2、返回值 

在调用某个函数时,通常希望能够得到一个确定的值,就是函数的返回值。

int Minus(int iNumber1, int iNumber2)
{
	int iResult;					/*定义一个整型变量,用来存储返回的结果*/
	iResult = iNumber1 - iNumber2;
	return iResult;						/*return 语句返回计算结果*/
}
int main()
{
	int iResult;						/*定义一个整型变量*/
	iResult = Minus(9, 4);				/*进行 9-4 的减法计算,并将结果赋值给变量 iResult */
	return 0;						/*结束程序*/
}

①函数的返回值都通过函数中的 return 语句获得,return 语句将被调用函数中的一个确定值返回到调用函数中。

②函数返回值的类型。既然函数有返回值,这个值当然应该属于某一个确定的类型,因此应在定义函数时明确指出函数返回值的类型。例如:

int Minus(int iNumber1, int iNumber2);
double Min(double dNum1,double dNum2);
char Show(char cChar);

 ③如果函数值的类型和 return 语句中表达式值不一致,则一函数返回值的类型为准。数值型数据可以自动进行类型转换,即函数定义的返回值类型决定最终返回值的类型。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

char ShowChar()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半边山的海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值