函数(c)

1.函数的概念

        说到函数,我们可能第一想到的就是小学或中学数学中所学的函数,其实也可以把理解数学中函数的方式来理解程序中的函数。函数是怎样来的呢?

        我们用的main(),其实就是一个函数,它是一个程序运行的入口,而一个代码中有且只能有一个main()函数,而我们如果所有代码都写在一个main()函数里面的话想象一下会有多么繁杂和混乱,后来就引入子程序(也就是函数)的概念,C语言程序就是无数个函数来实现的

2.库函数

        像printf,scanf等等都是库函数,在头文件<stdio.h>中,printf,scanf是有返回类型的,它们的功能也是非常的强大,库函数是怎样来的呢?
        开始并没有库函数这一概念,要把信息打印到显示屏上或要把信息从键盘输入,都需要程序员自己写代码来实现,而几乎所有人都要做这样的事情,都各自有各自的写法,然后就有了国际标准ANSI 规定(因此也使c语言得到很好的发展)printf,scanf等等的函数功能和用法,然后由编译器厂商去实现,放头文件里,程序员包含一下头文件就可以直接使用。
        库函数很多,用起来很高效,需要我们有一个学习函数的正确方法去逐个学习。接下来有两个学习网站:

cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/

C/C++官⽅的链接:https://zh.cppreference.com/w/c/header

关于库函数的学习我们主要关注以下几点

1.函数名

2.函数功能

3.函数参数

4.函数返回类型

3.自定义函数

        而光有库函数是不够用的,我们需要自己来实现一些函数。

举个例子:

int sum(int a,int b)
{
    int sum;
    sum=a+b;
    return sum;
}
#include<stdio.h>
int main()
{
    int k=sum(5,8);
    printf("%d",k);
    return 0;
}

        函数的语法

c9f7a9c12c7d49dfaa73366cee0f4462.jpeg

例2:

07116b53ac9d45ff927d9c8245d0c5f7.webp

注:函数里面不可以定义函数。

4.形参和实参

4.1形参是在定义函数时所写的参数


4.2实参是传给函数的真实参数


        函数不被执行前形参是不会向内存申请空间,只是形式存在,函数被执行后形参会类似的拷贝一份(数组除外)实参的数据存入申请的内存。

        因此,实参的数据非常大的时候,会导致效率降低,那么我们也可以传入地址(指针)通过地址去寻找数据更高效。

5.return语句

        在函数的设计中,函数中经常会出现return语句,这⾥讲⼀下return语句使⽤的注意事项。

5.1 return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式

的结果。

5.2 return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。

5.3 return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。

5.4 return语句执⾏后,函数就彻底返回,后边的代码不再执⾏。

5.5 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。

6.函数的嵌套使用和链式访问

        嵌套使用也就是一个函数内使用另一个函数(不是定义)。

        链式访问是指一个函数的返回值作为另一个函数的参数,例如:
#include<stdio.h>
int main()
{
    int k=54;
    printf("%d",printf("%d",printf("%d",k)));
    return 0;
}
        而printf返回值是读取字符的个数。
        运行结果为:5421

7.函数的定义和声明

7.1单个文件


        函数的定义本身也是一种特殊的声明,但如果自定义函数在主函数(main函数)后面的话,前面不加声明,就无法识别,所以需要在主函数前加上声明。

5f0f3261bd814a8791be394bb666b5d6.png

7.2多个文件


        函数可以在点.h(头文件)后缀的文件里声明,在.c(源文件)后缀文件里实现,而在另.c后缀文件里使用(该点c文件,需要包含点h头文件,而自定义的头文件是用双引号,例如:#include"text.h")

例如:

56b90f8cc0bd479d922e800db746b0a1.png

它的好处就在于有利于多人合作,提高效率。除此之外还可以起到隐藏代码的作用。

8.static和exter

8.1static和extern,是在C语言里的两个关键字。

c6796a1dddbd4651871ab531b4ed08f6.jpeg
8.2内存可以分为三个区:栈区,堆区和静态区。

        局部变量是在 栈区中申请内存,在作用范围(作用域)外是无效的(生命周期结束),即内存被收回收。例如,for循环内定义的变量只作用在for循环。出了for循环就无效,在一个函数内定义的变量不能用于另一个函数。(栈区存储的数据是先进后出,可以联想到这里去理解局部变量的作用域(比如两个嵌套的for循环中的变量))。
        全局变量是在 静态区中申请内存,可以在整个项目内都有效。
#include<stdio.h>
int a;
int main()
{
    int b;
    return 0;
}

      像这里变量a就是一个全局变量,b就是一个局部变量。

        而使用 static修饰,可以使局部变量的空间在静态区上申请,使他在整个项目中都有效。
extern可以用来声明外部变量,如在A文件中的程序想要在B文件中使用,可extern来链接,如下代码:
9b3c56b717f04285beeaca6707fb8b72.png

 而如果A文件中该程序被static修饰,外部链接属性会变为内部链接性,在B文件中无法使用。

b40232eb286f491698eaf91697faecbf.png

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值