C语言函数的作用:使用函数可以不用重复编写代码,如果想实现某一特定程序和效果,可以通过编写函数来实现,使用时在主函数中调用就行,函数还是得程序更加模块化,从而提升了代码的简洁性和可读性,方便后期完善和修正。通俗来讲就是把执行某些固定功能的代码块从主函数中挪出来写成函数,要使用时就调用这个函数,简化了主函数,方便观看理解和后期调试。
C语言函数分为两类:库函数和自定义函数,库函数为系统自带的已经编写好的函数,我们只需要学会调用和使用方法就行,自定义函数为我们用户自己写的为了实现某种特定功能的函数。本章主要讲解自定义函数。
一个程序中只能有一个主函数,可以有无数个自定义子函数。
函数的基本结构如下:
类型名 函数名(参数列表)
{
函数体
}
return_type function_name( parameter list )
{
body of the function
}
函数类型有四种:无参数无返回值,有参数无返回值,无参数有返回值,有参数有返回值。
这里着重讲第一种和第四种。
参数也有实际参数和形式参数两种,实际参数是主函数当中用户将要传入计算的值,实参会从主函数传入函数中,传入函数后的参数叫做形式参数,就是形参。函数通过计算后一般有返回值,这个返回值在主函数中一般用一个变量承接使用。
函数使用法则:先声明再调用。
这里演示一个无参数无返回值的函数执行的打印出一个“C”字形状的功能:
#include <stdio.h>
void print_C(void); //声明函数
void main() {
print_C(); //调用函数
}
void print_C() //写的函数,执行用“#”打印出一个C
{
printf(" #### \n");
printf("## ##\n");
printf("## \n");
printf("## \n");
printf("## ##\n");
printf(" #### \n");
}
无返回值的函数一般都是执行某些非计算类的功能,实际在学习数据计算方面用的比较少,在单片机学习中多数用于配置寄存器,这里补充一点点的单片机寄存器配置知识点,单片机普通常见的寄存器是有8个位,每个位可写1或者写0,这样看起来就像是二进制一样,但是用C语言写要换成十六进制,然后相对应地写成什么样子寄存器执行相对应的功能。而单片机有时候为了实现某种功能要配置好几个器件,这样我们就可以把这些写在一个函数里,这样在主函数当中直接调用就行,就可以在主函数中省略掉配置寄存器的步骤,美化简洁了主函数。
#include<stdio.h>
void Timer0_Init(void); //声明函数
void main()
{
Timer0_Init(void); //这是单片机程序编写规则,初始化函数,C此处可暂时作为了解
while (1)
{
}
}
void Timer0_Init(void) //配置51单片机例子
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
PT0 = 0;
}
运行结果位0错误0警告。
注意每个函数例子,函数的使用都是先声明再调用,这样才能使用我们自己写的函数。但是如果函数写再主函数前面,就不需要声明函数,可以直接调用,但是不推荐。上面这种无参数无返回值的是单片机程序当中很常见的一种,编写原则也非常简单,就直接把想实现的模块放进函数当中就行,上述例子当中的TMOD是一种寄存器的名字,用十六进制(0x就是十六进制)进行编写,实现相对应的功能。
有参数有返回值类型,这里演示输入两个数,返回最大的那个数的功能:
#include <stdio.h>
int max(int x,int y); //声明函数
void main() {
int a, b, c;
scanf_s("%d %d", &a, &b);
c = max(a, b); //调用函数
printf("最大的数是:%d", c);
}
int max(int x, int y) //执行判断两个数大小的函数
{
if (x > y)
return x;
else
return y;
}
根据上述例子,我们要引入两个概念,实际参数和形式参数,它们两者存在数据传递关系,上述中 max(a,b)中的a,b为实际参数,这两个的参数传递给函数max(),然后赋值给了下面自定义函数的x,y,这俩就是形式参数。而x,y有了值,就在自定义函数当中进行运算,下面的return可将运算过的数给回主函数的max()函数,然后在主函数中给了变量c,就继续了主函数的程序,这就差不多是有参数有返回值的函数的运行过程。
再补充一个例子:
#include<stdio.h>
int add(int x,int y) //实现两个函数相加的自定义函数
{
return x+y;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b); //输入实际参数
int c= add(a,b); //因为写在了主函数前面,所以可以直接在主函数中调用
printf("%d\n",c);
return 0;
}
运行结果为你输入两个数,然后出现它俩之和。
#include <stdio.h>
int isprime(int x);
void main() {
int a,b;
scanf_s("%d", &b);
a = isprime(b);
if (a == 0)
{
printf("这不是素数");
}
else
{
printf("这是素数");
}
}
int isprime(int x) //这个形参用于接收需要判断的数字
{
int i = 2;
for (i = 2; i < x; i++) //从2到这个数字减一逐一试除
{
if (x % i == 0) //如果有能除开的就表明它不是素数,返回0
{
return 0;
}
}
return 1; //在除完所有的数字均除不开时,为素数返回1
}
一般来说,有参数有返回值的函数涉及运算,而函数的代码块部分内容为读者自己根据自己需求而进行自行编写,不唯一,不过得掌握上述的基本原理,实际参数和形式参数的传递,在函数的返回值,主函数中的运行。
补充:内部函数外部函数。
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加 static,即
static 类型名 函数名 (形参表)
这样写的函数很稳定,可以使函数的作用域只局限于所在文件。即使在不同的文件中有同名的内部函数,也互不干扰。提高了程序的可靠性。
如果在定义函数时,在函数的首部的最左端加关键字 extern,则此函数是外部函数,可供其它文件调用。
如函数首部可以为:extern int max (int a,int b)
C 语言规定,如果在定义函数时省略 extern,则默认为外部函数。
在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型来声明)。在对此函数作声明时,要加关键字 extern,表示该函数是在其他文件中定义的外部函数。
希望对于准备进入大一的学生有些许帮助