文章目录
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、函数是什么?
在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部份代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。
函数相当于一个子程序,C语言中提供了一些库函数,用户也可自定义函数,用来实现某些功能,当总程序需要执行该功能时,直接调用函数即可。
二、函数分类及调用
库函数:C语言基础库中提供的一系列语句,方便程序员进行开发,例如printf()打印输出、scanf()输入内容等等。直接点说,我们平常开发用的那些功能语句就是库函数,C语言已经定义好的,可以直接拿来用的,只不过一些函数使用前需要引入头文件,例如#include<stdio.h>。
常用的库函数有:IO函数、字符操作函数、字符串操作函数、内存操作函数、时间/日期函数、数学函数等。
库函数学习可以登录www.cplusplus.com,里面包含C和C++的库函数,直接搜索,会有相应介绍、头文件、使用方法及示例。
自定义函数: 该类型函数由用户自己设计来实现某些功能,在定义时包含四个元素:返回类型、函数名、传入参数和函数体。
#include<stdio.h>
int Getmax(int x, int y)//返回类型int,函数名Getmax,传入参数x,y
{
int z = 0;//函数体
if (x >= y)
z = x;
else
z = y;
return z;
}
int main()
{
int result=Getmax(5, 10);//函数调用,获得5和10的最大值
printf("%d", result);
return 0;
}
基于上面程序,介绍下形参和实参。在调用自定义函数时需要传递参数,参数分为实参(上面程序的5和10)和形参(a和b),
实参可以是常量、变量、表达式和函数等,无论何种类型,必须有确定的值,在函数调用时,将值传递给自定义函数。
形参只有在函数调用时才会被分以内存单元用来储存传入的值,函数调用完后自动销毁,因此形参只在函数中有意义。
参数在传递过程中分为传值和传址,上面程序属于传值调用,二者区别参考下面程序。
#include<stdio.h>
void Exchange1(int x, int y)//void无返回值,传值
{
int a = 0;
a = x;
x = y;
y = a;
printf("交换后的值为%d和%d\n", x, y);
}
void Exchange2(int* x, int* y)//void无返回值,传址
{
int a = 0;
a = *x;
*x = *y;
*y = a;
printf("交换后的值为%d和%d\n", *x, *y);
}
int main()
{
int a = 5;
int b = 10;
Exchange1(a,b);//将a、b的值传入
printf("a的值为%d,b的值为%d\n", a, b);//输出交换后a和b的值
Exchange2(//将a、b地址传入
printf("a的值为%d,b的值为%d\n",a,b);
return 0;
}
传值调用:形参实参占不同内存块,对形参的改变不会影响实参。如Exchange1()将a、b的值传给自定义函数,函数中操作x和y并未实际改变a和b的值,
传址调用:是把变量的内存地址传递给函数参数,这种方式可使函数与函数外部的变量建立真正的联系,也就是函数可操作函数外部的变量。如Exchange2 ()将a、b的地址传给自定义函数,函数中操作会改变a和b的值。
上述代码结果如下:
1.自定义函数的嵌套调用
在一个函数中调用另一个函数,函数不可以嵌套定义但可以嵌套使用。示例如下,在Exchange2 ()中嵌套调用Exchange1()。
#include<stdio.h>
void Exchange1(int x, int y)//void无返回值,传值
{
int a = 0;
a = x;
x = y;
y = a;
printf("交换后的值为%d和%d\n", x, y);
}
void Exchange2(int* x, int* y)//void无返回值,传址
{
int a = 0;
int b = 0;
a = *x;
b = *y;
Exchange1(a, b);
}
int main()
{
int a = 5;
int b = 10;
Exchange2(//将a、b地址传入
printf("a的值为%d,b的值为%d\n",a,b);
return 0;
}
2.自定义函数的链式访问
链式访问就是把一个函数的返回值作为另一个函数的参数,以两个库函数为例:strlen()是求字符段长度的库函数,将其返回值作为参数传给printf()函数输出。
#include<stdio.h>
int main()
{
int len = strlen("abc");
printf("长度为%d\n", len);
printf("长度为%d\n", strlen("abc"));
return 0;
}
3.自定义函数的递归调用(重点)
程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。重要思想在于把大事化小。
递归的两个必要条件:
存在限制条件,当不满足这个条件时,递归不再继续
每次递归调用时越来越接近限制条件,即程序不能无限制递归下去
函数重复调用自身,层层“递”下去,直到达到限制条件,再层层“归”回来。实例程序如下:
定义Math()函数,将传进去的整数,按位输出。刚传入1235,大于9,除10取整递进下一层,到下一层123,再次除10递进;直到第四层为1时,不满足大于9,执行下面程序将1打印,返回第三层,12除10余2打印,返回第2层,123除10余3打印,返回第四层,1234除10余4打印。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void Math(int a)
{
if (a > 9)
{
Math(a / 10);
}
printf("%d\n", a % 10);
}
int main()
{
printf("请输入一个整数:\n");
int number = 0;
scanf("%d", //接收输入的值
Math(number);
return 0;
}
总结
以上为C语言函数基本内容,如有为您提供一些帮助也不负此次编辑,接下来会更新函数的运用实例。