嵌入式C:函数

本文详细介绍了C语言中的函数概念,包括其分类(按定义、参数和返回值),定义方法,声明与调用规则。强调了函数在编程中的重要性,如模块化、可重用性和可读性提升。
摘要由CSDN通过智能技术生成

一、函数的概念

这个是简单一点的理解:
函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。
定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
函数就是讲特定功能的代码封装在一个函数内部,当要使用这些代码时,只需要通过函数名就可以使用,这样操作起来更加方便

这个是详细的理解:

在 C 语言中,函数是一种用于执行特定任务或操作的独立代码块。函数可以接受输入参数(也称为参数)并返回一个值作为结果。函数的使用有助于模块化程序,使代码更易于理解、维护和重用。

以下是关于 C 语言函数的一些重要概念:

  1. 函数声明:在使用函数之前,需要提前声明函数。函数声明包括函数的返回类型、函数名以及参数列表(如果有参数)。函数声明通常在程序的开头或使用函数之前进行。

  2. 函数定义:函数定义包括函数的实际实现,即函数的具体代码。函数定义包括函数头和函数体。函数头包括函数的返回类型、函数名和参数列表,函数体包括函数的具体实现代码。

  3. 函数参数:函数可以接受零个或多个参数作为输入。参数是在调用函数时传递给函数的值。参数可以是任何数据类型,包括基本数据类型(如整数、浮点数)和复杂数据类型(如数组、结构体)。

  4. 函数返回值:函数可以返回一个值作为结果。返回值的类型由函数声明中的返回类型指定。如果函数不需要返回值,可以使用 void 关键字表示。

  5. 函数调用:要使用函数,需要在程序中调用函数。函数调用包括函数名和传递给函数的参数列表。在调用函数时,程序会跳转到函数定义处执行函数体,然后返回结果。

  6. 递归函数:C 函数可以是递归的,即函数可以调用自身。递归函数在解决某些问题时非常有用,但要小心避免无限递归。

  7. 函数原型:函数原型提供了函数的声明,但没有函数的具体实现。函数原型通常用于在文件之间共享函数声明,以便在一个文件中定义函数,在另一个文件中使用函数。

  8. 函数指针:函数指针是指向函数的指针变量。通过函数指针,可以动态地选择要调用的函数,这在某些情况下非常有用,例如在回调函数中使用。

函数是 C 语言中非常重要的概念,它们使程序更具结构化、模块化和可维护性。通过合理设计和使用函数,可以提高代码的可读性和重用性。

二、函数的分类

1、从定义角度分类(即函数是谁实现的)
        (1)库函数 (c库实现的)
        (2)自定义函数 (程序员自己实现的函数)
        (3)系统调用 (操作系统实现的函数)
2、从参数角度分类
(1)有参函数
        函数有形参,可以是一个,或者多个,参数的类型随便
        完全取决于函数的功能
int fun(int a,float b,double c)
{
}
int max(int x,int y)
{
}
2)无参函数
        函数没有参数,在形参列表的位置写个void或什么都不写
int fun(void)
{
}
int fun()
{
}
3、从返回值角度分类
(1)带返回值的函数
        在定义函数的时候,必须带着返回值类型,在函数体里,必须有return
        如果没有返回值类型,默认返回整型。
例1:
char fun()//定义了一个返回字符数据的函数
{
    char b='a';
    return b;
}
例2:
fun()
{
    return 1;
}
如果把函数的返回值类型省略了,默认返回整型
注:在定义函数的时候,函数的返回值类型,到底是什么类型的,取决于函数的功能。
(2).没返回值的函数
在定义函数的时候,函数名字前面加void
void fun(形参表)
{
;
;
return ;
;
}
在函数里不需要return
如果想结束函数,返回到被调用的地方, return ;什么都不返回就可以了
例3:
#include <stdio.h>
int max(int x,int y)
{
    int z;
    if(x>y)
        z=x;
    else
        z=y;
    return z;
1}
void help(void)
{
    printf("*********************\n");
    printf("********帮助信息*****\n");
    printf("*********************\n");
    }
int main(int argc, char *argv[])
{
    int num;
    help();
    num = max(10,10+5);
    printf("num=%d\n",num);
    return 0;
}

运行结果:

三、函数的定义

1、函数的定义方法
返回值类型 函数名字(形参列表)
{
//函数体,函数的功能在函数体里实现
}
注意:
函数名字是标识符,所以需要满足标识符的命名规则
形参:可以有,也可以没有,也可以有多个,但是即使没有,函数名字后面也必须 加括号
函数体上下位置必须有大括号
如果要返回函数执行的结果,也就是返回值,则return后面跟的变量或者值,必须与函数名左边的返回值类型一致
形参必须带类型,而且以逗号分隔
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数, 所有的函数的定义是平行的。
在一个程序中,相同的函数名只能出现一次
//定义一个没有参数也没有返回值的函数
void myfun1()
{
    printf("hello world\n");
    printf("nihao beijing\n");
    printf("welcome to 1000phone\n");

    return ;
}

//定义一个有参数的函数
void myfun2(int a, int b)
{
    int sum;
    sum = a + b;

    printf("%d + %d = %d\n", a, b, sum);
}

//定义一个有返回值的函数
int myfun3(int a, int b)
{
    int sum;
    sum = a + b;
    return sum;
    
}

四、函数的声明

1、概念
对已经定义的函数,进行说明
函数的声明可以声明多次。
2、为什么要声明
有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,
因为编译器在编译c程序的时候,从上往下编译的。
3、声明的方法
什么时候需要声明
        主调函数和被调函数在同一个.c文件中的时候
        被调函数在上,主调函数在下
void fun(void)
{
    printf("hello world\n");
}
int main()
{
    fun();
}

这种情况下不需要声明
         被调函数在下,主调函数在上
int main()
{
    fun();
}
void fun(void)
{
    printf("hello world\n");
}
编译器从上往下编译,在main函数(主调函数),不认识fun,需要声明
怎么声明呢?
(1)直接声明法(常用)
将被调用的函数的第一行拷贝过去,后面加分号
#include <stdio.h>

//函数的声明:一般当子函数在主函数的下方时,需要在主函数的上方进行声明
void myfun1();
void myfun2(int a, int b);
int myfun3(int a, int b);
int main(int argc, char *argv[])
{
    myfun1();
    return 0;
}

void myfun1()
{
    printf("hello world\n");
    printf("nihao beijing\n");
    printf("welcome to 1000phone\n");

    return ;
}

void myfun2(int a, int b)
{
    int sum;
    sum = a + b;
    printf("%d + %d = %d\n", a, b, sum);
}
int myfun3(int a, int b)
{
    int sum;33 sum = a + b;

    return sum;
}
(2) 间接声明法
将函数的声明放在头文件中,.c程序包含头文件即可
a.c
#include”a.h”
int main()
{
    fun();
}
void fun(void)
{
    printf("hello world\n");
}

a.h
extern void fun(void);
主调函数和被调函数不在同一个.c文件中的时候 一定要声明
声明的方法:
        直接声明法
                将被调用的函数的第一行拷贝过去,后面加分号,前面加extern
        间接声明法(常用)
                将函数的声明放在头文件中,.c程序包含头文件即可
 myfun.c
#include "myfun.h" //此时包含的头文件要使用双引号,在当前目录下去找对应头文件

void myfun1()
{
    printf("hello world\n");
    printf("nihao beijing\n");
    printf("welcome to 1000phone\n");

    return;
}

myfun.h
#ifndef MYFUN_H
#define MYFUN_H

//函数的声明
void myfun1();

#endif // MYFUN_H

main.c
#include <stdio.h>
#include "myfun.h"

int main(int argc, char *argv[])
{
    myfun1();

    return 0;
}

五、函数的调用

函数的调用方法
变量= 函数名(实参列表);//带返回值的
函数名(实参列表);//不带返回值的
#include <stdio.h>

void myfun1();
void myfun2(int a, int b);
int myfun3(int a, int b);
int main(int argc, char *argv[])
{
    //函数的调用
    //没有参数也没有返回值
    //直接写函数名,并且要在后面加括号
    myfun1();

    printf("**********************\n");14
    //有参数,没有返回值
    //需要在函数名右边括号中传入参数,参数可以是常量表达式,也可以是变量表达式
    myfun2(100, 90);

    int x = 10, y = 20;
    //x、y:实参,实际参数,本质就是在函数调用的时候将实参的值传递给形参
    myfun2(x, y);

    printf("**********************\n");

    //有参数也有返回值
    //可以使用一个变量接收函数执行结果(返回值),或者直接输出也可以
    int n;
    n = myfun3(100, 90);
    printf("n = %d\n", n);

    printf("sum = %d\n", myfun3(90, 66));

    return 0;
}

void myfun1()
{
    printf("hello world\n");
    printf("nihao hello\n");
    printf("welcome to hello\n");
    return ;
}

//a、b:形参,形式参数,主要用于保存实参传递的值,本质跟实参没有任何关系,只是值传递
void myfun2(int a, int b)
{
    int sum;
    sum = a + b;

    printf("%d + %d = %d\n", a, b, sum);
}
int myfun3(int a, int b)
{
    int sum;
    sum = a + b;

    return sum;
}
运行结果:
六、函数总结

在定义函数时,确定函数的参数和返回值应根据函数的具体功能来决定。在编写函数时,最初的重点应该放在函数的逻辑和功能上,而不是过早地考虑参数传递和返回值。当在编写代码时需要使用某些值,但当前函数中不存在这些值时,才需要考虑如何传递参数。这样的思维过程可以确保参数传递的合理性。

一旦函数编写完成,再考虑是否需要将某些结果返回给其他函数使用,这时需要考虑返回值的设计。使用函数的好处包括:一次定义,多次调用,减少代码的冗余度;提高代码的模块化程度,便于调试和阅读。

通过合理设计和使用函数,可以使代码更具可维护性和可读性,同时提高代码的重用性和整体质量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值