C语言函数详解

一、C语言中函数(又称为子程序)概念:

C语言的函数就是完成某项特定任务的一小段代码且这段代码有特定格式与调用方法。

与我们数学中所见到的函数类似,如 y = kx+b ,目的是为根据已有条件计算出4个变量中的某个or几个值。在C语言中我们就是要根据已有条件进行相关程序操作来得到指定变量的值。

C语言中我们一般多见两种函数:

1、库函数

2、自定义函数

二、库函数

1、标准库与头文件

库函数如  printf   scanf   等都是已经设置好的函数,我们只要学会它的语法就可以直接调用,但在调用时需要包含对应库函数的头文件(不同功能库函数有不同的头文件),比如上述两种均包含于<stdio.h> 标准输入输出头文件中,与数学相关如<math.h>,与字符串相关如:<string.h>,其余给大家提供网站自行查找,不再赘述。

库函数相关头文件网站(也是C/C++官方链接):https://zh.cppreference.com/w/c/header

此处我以 printf 作为举例展示:

阅读下列代码,思考为何输出下列结果:

此处就涉及到 printf 函数返回值的问题,这是一个printf的链式访问(链式访问具体见下一个博文),从最里面开始向外逐个打印,根据https://zh.cppreference.com/w/c/header 官网内容我们知printf的返回值是打印的字符的数量,所以最内部的在打印完43后,传递给第二个printf的返回值是2(2个字符),所以第二个printf就会打印2从而传递给第一个printf的返回值为1(1个字符)。故最终打印结果为4321。

再思考我若在每个%d后加个空格,输出结果为何?(如下图,提示空格也是字符)

三、自定义函数

1、语法格式

ret_type  fun_name(形式参数)

{

函数体

}

ret_type 指函数返回类型

fun_name 指函数名(注意不要与关键字冲突)

括号内为形式参数,大括号内为函数体,即完成函数指定任务的具体执行程序

我们可将函数视为一个工厂,参数视为原材料,函数体视为加工厂,产品视为返回值即结果

如此我们便方便理解形参为空 void 时,返回类型便也可为空 void。

2、函数举例

下面我们以自定义一个加法函数为例

Add函数也可以简化为:

由上面函数我们要注意对函数参数的相关信息交代清楚:1、参数类型;2、参数个数;3、形参名

四、形参和实参

1、实参:

如上面程序第98行对Add函数进行调用时传递给Add函数的参数a 和 b就是实际参数,简称为实参。(即真实传递给函数的参数

2、形参:

在第88行对Add函数进行定义时所定义的变量c和d就是形式参数,简称形参。

形式参数,顾名思义,即若只是定义了Add函数,但并不对其进行调用,则Add的形式参数c和d就仅仅是形式上存在,不会向内存申请空间,不会真实存在。

形式参数只有在函数被调用时为了存放实参传递过来的值才会申请内存空间,这个过程称为实例化。

3、形参与实参的关系

(1) 完全不同的内存空间   (2)形参是实参的一份临时拷贝     (3)形参的修改不会影响实参

如图:

五、对return语句的初步认识

1、return后边可以是一个数值(只能是1个[ 返回多个可利用结构体 ],多个数值在C语言中不可,在Python等语言内可行),也可以是一个表达式,若为表达式则先执行表达式,再将表达式的结果作为返回值。

2、若函数返回类型为void,则可以直接写return,后面什么都不跟

3、若return的返回类型和函数的返回类型不一样,系统会自动进行隐式转换将return返回的值的类型转换为函数的返回类型。

4、return语句一旦执行后,函数会彻底返回,后面的代码不在执行。

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

对第五条再简述一下,如下图几行代码

我们之所以不写else的情况是因为 if 后并未加大括号,故 if 做完条件判断后就只会执行后面的一句day += 1;如果符合判断执行完这一句后直接走retern day(只不过这个day相比原来多1),如果不符合判断也会走return day(还是原来day的值)。

上述可以类比成同一个终点有两条路,不管怎么走都会到终点,终点就相当于day这个返回值,两条路就好比两个条件分支。

六、数组作为函数参数

1、数组传参关键点:

(1)函数的形参个数要与函数的实参个数相匹配

(2)函数实参为数组,形参也可以写成数组形式

(3)数组传参,形参是不会创建新数组的

(4)形参为一维数组,数组大小可省略;若为二维数组,行标可省略,列标不可省略

(5)形参操作的数组和实参的数组是同一个数组

2、举例:

我们写一个函数将已初始化的一个整形数组全部设置为0,在写一个函数将改后的数组打印出来

我们先定义初始化数组部分,将重置数组函数命名为set_arr,将打印数组函数命名为print_arr。

下面我们来对两个自定义函数进行设置

输出结果:

注意点:把数组作为参数传递给函数时只用数组名即可,即arr_name,不要写成arr1[ 2 ],这么写传的就不是数组了,而是arr1数组中下标为2的元素。

七、函数的声明和定义

1、单个文件

函数一定要先声明(定义是一种特殊的声明)后使用,否则会报错

两种使用方式:

对函数的声明就是告诉编译器:1:函数名是什么,2:参数类型是什么(参数可保留名字也可不保留),3:返回类型是什么

如下:

2、多个文件

在代码较多的情况下,我们常把程序按照不同的功能拆分放在不同的文件中。便于多人操作修改。

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

如下:

set_arr.h

set_arr.c

test.c

3、相较于单个文件分块成多个文件的好处

1、逻辑清晰      2、方便多人操作     3、可适当的隐藏代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值