C语言知识清单(5)——函数

函数

1.函数的概念

在C语言中,函数就是一个完成某项特定的任务的一小段代码。这段代码是有特殊的写法和调用方法的也叫做子程序。

C语言的程序其实是由无数个小的函数组合而成的 也可以说:一个大的计算任务可以分解成若干个较小的函数(对应较小的任务)完成。同时一个函数如果能完成某项特定任务的话,这个函数也是可以复用的 提升了开发软件的效率。

C语言中我们会见到两类函数:库函数和自定义函数。

2.库函数

C语言标准中规定了C语言的各种语法规则,C语言并不提供库函数。C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为库函数。

之前学过的printf,scanf,都是库函数,库函数也是函数,不过是现成的,可以直接使用。记得引用对应的头文件。

相关链接:https://zh.cppreference.com/w/c/header

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

ps:库函数文档的一般格式

函数原型—函数功能介绍—参数和返回类型说明—代码举例—代码输出—相关知识链接

3.自定义函数的语法形式

       ret_type fun_name(形式参数)

       {

        函数体

        }

ret_type是函数返回类型,也就是函数计算结果的类型,有时候返回类型可以是void,表示什么都不返回。

fun_name是函数名,尽量起的有意义,可以看出函数的用处。

括号中放的是形式参数,相当于工厂中送去的原材料,函数的参数也可以是void,明确表示函数没有参数。如果有,需要交代清楚函数参数的类型和名字,以及参数个数。注意要交代清楚:参数个数,每个参数的类型是啥,形参的名字叫啥。

{}里面是函数体,即完成计算的过程。

4.形参与实参

实参:在调用函数时实际传给自定义函数的参数

形参:在定义函数时,在函数名后面的括号里的x和y就是形式参数,即只是定义了函数而不去调用的话函数的参数只是形式上存在的,不会向内存申请空间,不会真实存在,所以叫做形式参数。形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就叫做形参的实例化。

5.形参与实参的关系

  • 形参与实参是完全不同的内存空间
  • 形参是实参的一份临时拷贝
  • 形参的修改不会影响实参

6.return语句使用的注意事项

  • return后面可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果。
  • return后面可以什么都没有,直接写return;这种写法适合函数返回值是void的情况。
  • return返回的值和函数返回类型不一致,系统会自动将返回的值隐藏式转换为函数的返回类型。
  • return语句执行后,函数就彻底返回,后面的代码不再执行。
  • 如果函数中存在if等分支语句,则要保证每种情况下都有return返回,否则会出现编译错误。

7.数组做函数参数

在使用函数解决问题时,难免会将数组作为参数传递给函数,在函数内部对数组进行操作。但是当函数要能对数组内容进行设置或运算时,需要遍历数组每一个元素,所以我们要给函数两个参数一个是数组arr,一个是数组的元素个数sz。

int sz = sizeof(arr)/sizeof(arr[0])

数组传参的重要知识点

  • 函数的形式参数要和函数的实参个数匹配
  • 函数的实参如果是数组,形参也是可以写成数组形式的
  • 形参如果是一维数组,数组的大小可以省略不写
  • 形参如果是二维数组,行可以省略,但是列不能省略
  • 数组传参,形参是不会创建新的数组的
  • 形参操作的数组和实参的数组是同一个数组

据此我们定义函数

#include <stdio.h>

int main()

{

      int arr[] = {1,2,3,1,5,6,7,8,9,10};

      int sz = sizeof(arr)/sizeof(arr[0]);

      set_arr(arr,sz);

      printf_arr(arr,sz);

      return o;

}

void set_arr(int arr[],int sz)

{

         int i = 0;

         for(i = 0;i<sz;i++)

         {

                 arr[i] = -1;

         }

}

void printf_arr(int arr[],int sz)

{

       int i = 0;

       for(i=0;i<sz;i++)

       {

        printf("%d",arr[i]);

       }

        printf("\n");

}

8.嵌套调用

嵌套调用就是函数之间的互相调用,如main函数调用scanf,printf,以及自定义的函数。

注意:函数能嵌套调用但不能嵌套定义。

9.链式访问

所谓链式访问就是将一个函数的返回值作为另外一个函数的参数,向链条一样将函数串起来就是函数的链式访问。

如:把一个函数的返回值作为另一个函数的参数

printf("%d",printf("%d",printf("%d",43)));

这个代码的关键是明白printf函数的返回值是——打印在屏幕上的字符的个数

第一个printf打印的是第二个printf的返回值,第二个printf打印的是第三个printf的返回值

第三个printf打印43,屏幕上打印了2个字符,返回2;第二个printf打印2,屏幕上打印了1个字符,返回1;第一个printf打印1

最终屏幕上打印:4321

10.函数的申明和定义

函数的调用一定要满足先声明后使用

函数的定义也是一种特殊的声明,所以如果函数定义放在调用之前也是可以的。

11.一个项目(text.c)通常会分为多个文件

一般情况下,函数的声明,类型的声明放在头文件(.h)中,函数的实现放在源文件(.c)中

好处:逻辑清晰,方便多人使用,

          以及适当隐藏代码,导入静态库

          #progma comment(lib "add.lib")

12.static和extern

static和extern都是C语言中的关键字

static是静态的的意思,可以用来:

  • 修饰局部变量:改变了局部变量的生命周期,本质是改变了变量的存储类型,局部变量本来存储在内存的栈区,static修饰后存储到了静态区,和全局变量的生命周期一样了,作用域不变,但只有程序销毁,变量才销毁,内存才回收。如:一个变量出了函数后我们想保留值,等下次进入函数时使用,可以用static修饰。
  • 修饰全局变量:表示这个全局变量只能在本文件使用,不能在其他源文件使用。全局变量默认有外部连接属性,外部文件适当申明就可以使用,但是static修饰了别的源文件就不能用了,相当于共享单车不允许骑出校园,只能自己使用。
  • 修饰函数:和全局变量一样的,只能本文件使用。

extern用来申明外部符号,让别的文件可以使用这个文件的全局变量。

13.作用域

限定一个名字的代码范围就是这个名字的作用域

局部变量的作用域是变量所在的局部范围

全局变量的作用域是整个项目

14.生命周期

指变量的创建(申请内存)到变量的销毁(内存回收)之间的一个时间段。

全局变量的生命周期:整个程序的生命周期

局部变量的生命周期:进入作用域变量创建,生命周期开始,出作用域生命周期结束。

 

 

 

 

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山轻舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值