在C语言中,所有的程序设计都必须含有一个主函数(main函数),对于简单问题的程序设计,我们可以将所有的语句、功能都写在主函数中,但是如果程序功能比较复杂,所有代码都写在主函数中,会使阅读和运行都十分困难。因此,我们采用“组装”的办法简化程序设计的过程。
函数就是功能。不同的函数实现不同的功能,函数名通常反应函数的功能。一个C程序由一个主函数和若干个其他函数组成,主函数可以调用其他函数,各函数之间也可以互相调用。
函数分为两种(用户使用角度):
一、库函数
- 由系统提供,用户可直接调用。基本的库函数有以下几种:
- 数学函数
使用数学函数时,应该在源文件中使用如下命令行
#include <math.h>或#include "math.h"
-
- 字符函数与字符串函数
int main()
{
char arr1[]={"dhjas"};
char arr2[20]={0};
strcpy(arr2,arr1);//复制字符串
printf("%s",arr2);
return 0;
}
-
- 输入输出函数
- 动态存储分配函数
二、自定义函数
定义函数的方法:
1、无参函数
类型名 函数名(void)
{
函数体
}
2、定义有参函数
类型名 函数名(形参列表)
{
函数体
}
3、定义空函数
类型名 函数名 ()
{
}
函数体分为声明部分和语句部分。
函数调用
定义函数的目的就是为了调用。
调用形式:函数名(实参列表)
若调用无参函数,实参列表可以没有,但括号不可省略。
函数调用时的数据传递
1、形式参数与实际参数
在进行函数调用时,主调函数与被调函数之间有数据传递关系,在函数定义时,我们讲到函数名后面括号中的变量名称称为“形式参数”在主调函数中调用一个函数时,函数后面括号中的参数称为“实际参数”,实际参数可以是常量、变量以及表达式;
2、实参和形参之间的数据传递
在函数调用过程中,系统会把实参的值传递给别调用函数的形参。这种数据之间的传递称为虚实结合。
说明:1、在定义函数中指定的形参,在未进行函数调用时,他们并不占内存单元,只有在发生函数调用时形参才被临时分配地址;
2、将实参的值一一对应传给形参;形参与实参的名称可以相同,也可以不同;
3、通过return语句将函数值待会给主调函数;
4、函数被调完后,形参单元被释放;
5、实参可以向形参传数据,而形参不能向实参传数据。函数之间数据的传递是单向的;
函数的返回值
通过函数调用使主调函数返回一个确定的值,即函数值(函数的返回值)。
- 函数返回值通过函数中的return语句获得的。
- 函数类型决定返回值的类型。当函数值类型与return语句表达式的值不一致时,以函数类型为准。对于数值型的数据,可以自动进行转换。
对被调函数的声明
在一个函数中调用另一个函数需具备的条件:
1、被调用的函数必须已经被定义
2、如果使用库函数,则需要在本文件开头用#include指令将调用有关库函数时所需的信息包含进来。
3、如果使用自定义函数,且被调函数在主调函数后面,则应该在主调函数中对被调函数声明。
函数声明的形式:
1、函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,...)
2、函数类型 函数名(参数类型1,参数类型2,...)
函数的嵌套使用
C语言中函数的定义是互相平行的,独立的,也就是说在定义函数时,不能在一个函数内部在定义另一个函数,即函数不能嵌套定义。但是可以嵌套调用函数,即在调用一个函数过程中,又调用另外一个函数。
#include <stdio.h>
void dayin()//定义第一个调用函数
{
printf("haha\n");
}
void three_dayin()//定义第二个调用函数
{
int i;
for(i=0;i<3;i++)
dayin();//调用第一个函数
}
int main()
{
dayin();//调用第一个函数
three_dayin();//调用第二个函数
return 0;
}
函数递归
调用一个函数的过程中又直接或者间接地调用该函数本身,称为函数的递归调用。如:求n的阶乘
int jc(int n)
{
if(n>1)
return n*jc(n-1);
else
return 1;
}
int main()
{
int i;
printf("请输入一个数字:");
scanf("%d",&i);
int sum=jc(i);
printf("%d",sum);
return 0;
}
数组作为函数的参数
数组作为函数的参数时,分为数组元素作为函数的参数以及数组名作为函数的参数;
1、数组元素作为函数的实参
数组元素可以作为函数的实参,不能作为函数的形参,因为形参是在函数被调用时临时分配的存储单元,不可能为单独的一个数组元素分配地址。在数组元素作为实参时,把实参的值(数组元素的值)传给形参,是“值传递”的方式。
举例:输入10个数,要求输出其最大的元素以及该元素是第几个数。
int max(int x,int y )//定义比较函数
{
return (x>y?x:y);//返回较大值
}
int main()
{
int arr[10];//定义输入数字的数组
int i,n,m;
printf("请输入是十个数:");
for(i=0;i<10;i++)//输入十个数字
{
scanf("%d",&arr[i]);
}
for(i=1,m=arr[0],n=0;i<10;i++)//是个数组元素进行两两比较
{
if(max(m,arr[i])>m)
{
m=max(m,arr[i]);//将最大值存放在m中
n=i;//把最大值的下标记录下来
}
}
printf("最大的数为%d,其下标为%d",m,n);
return 0;
}
2、数组名作为函数参数
除了利用数组元素作为函数的参数,数组名也可以做为函数的参数(形参和实参);
用数组元素作为函数的实参时,向形参传递的是数组元素的值;而用数组名作为函数的参数时,传递的是数组首元素的地址;因为数组名就是数组首元素的地址;
举例:有一个一维数组,内存放了10个学生的成绩,求其平均值;
int main()
{
float average(float arr2[]);//求平均值函数的声明
float arr[10],aver;//定义数组,变量
int i;
printf("请输入十个学生的成绩:");//输入十个学生的成绩
for(i=0;i<10;i++)
scanf("%f",&arr[i]);
aver=average(arr);//调用average函数,数组名作为实参
printf("十个学生的平均成绩为:%f",aver);//打印平均成绩
return 0;
}
float average(float arr2[])//对average函数的定义
{ //arr1的首元素地址传递给arr2数组,两个数组具有同一地址,共同占用同一单元,arr[]指向同一单元;
int i;
float n ,sum;
for(i=0;i<10;i++)
sum+=arr2[i];
n=sum/10;
return n;
}
原文链接:https://blog.csdn.net/m0_56399733/article/details/132380520
文章评论