C语言学习笔记——函数

1.函数的定义和使用

1.1.什么是函数

  • 函数是一块代码,接收零个或多个参数做一件事情,并返回零个或一个值。

1.2.函数定义

1.3.调用函数

  • 函数名(参数值);
  • ()起到了表示函数调用的重要作用
  • 即使没有参数也需要()
  • 如果有参数,则需要给出正确的数量和顺序
  • 这些值会被按照顺序依次用来初始化函数中的参数

2.从函数中返回

2.1.从函数中返回值

  • return停止函数的执行,并送回一个值
  • return;
  • return 表达式;
  • 一个函数里可以出现多个return语句

2.2.没有返回值的函数

  • void 函数名(参数表)
  • 不能使用带值的return
  • 可以没有return
  • 调用的时候不能做返回值的赋值

3.函数原型

3.1.函数的先后关系

  • 像这样把 函数名() 写在上面,是因为:
  • C的编译器自上而下顺序分析你的代码
  • 在看到sum(1,10)的时候,它需要知道sum()的样子
  • 也就是sum()要几个参数,每个参数的类型如何,返回什么类型
  • 这样它才能检查你对sum()的调用是否正确

3.2.函数原型(声明)

  • 函数头,以分号“;"结尾,就构成了函数的原型
  • 函数原型的目的是告诉编译器这个函数长什么样,即先声明。
  • 旧标准习惯把函数原型写在调用它的函数里面现在一般写在调用它的函数前面
  • 原型里可以不写参数名字,但是规范仍写上较好

4.参数传递

4.1.调用函数

  • 如果函数有参数,调用函数时必须传递给它数量、类型正确的值
  • 可以传递给函数的值是表达式的结果,这包括: 字面量 变量 函数的返回值 计算的结果

4.2.类型不匹配

  • 调用函数时给的值与参数的类型不匹配是C语言传统上最大的漏洞
  • 编译器总是悄悄替你把类型转换好,但是这很可能不是你所期望的。后续的语言,C++/Java在这方面很严格

4.3.值传递

  • 每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
  • 过去,对于函数参数表中的参数,叫做“形式参数”,调用函数时给的值,叫做"实际参数"
  • 由于容易让初学者误会实际参数就是实际在函数中进行计算的参数,误会调用函数的时候把变量而不是值传进去了,所以我们不建议继续用这种古老的方式来称呼它们
  • 我们认为,它们是参数和值的关系
  • 以前的概念:

  • 现在的概念:

  • 值传递:函数调用时,实参将值传递给形参。主要有简单变量作为函数参数数组元素作为函数参数两类。
  • 特点:
    1. 单向传递,数据只能从实参单向传递给形参,而不能把形参的值反向传递给实参。
    2. 形参和实参分别占不同的存储单元
    3. 形参的改变不能影响实参的改变
  • 注意:指针作为函数参数时,将实参传给形参,是地址传递而不再是值传递,实参和形参共享同一段内存,形参的改变会影响实参。

4.4.地址传递

  • 地址传递指调用函数时,实参将某些量(如变量、字符串、数组)的地址传递给形参,使形参和实参指向同一存储单元,因此形参的改变能影响到对应的实参。
  • 地址传递方式下,形参可以是数组名指针,实参也可以是数组名或指针。因为数组名代表数组的起始地址(注意与上节值传递中的数组元素作区别),因此数组名作为函数的参数时,遵循地址传递的方式,将数组的起始地址传递给形参,使形参和实参共用同一片存储空间。
  • 说明:
    1. 实参和形参均应使用数组名。
    2. 实参数组和形参数组的类型应一致。
    3. 实参数组和形参数组的大小可以不一致,且形参数组可不指定大小。通常另设一个整型参数来传递数组元素个数。
  • 在用数组名作为函数参数传递时,形参和实参之间是双向传递的。

5.本地变量

5.1.本地变量(局部变量)

  • 函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量
  • 定义在函数内部的变量就是本地变量
  • 参数也是本地变量

5.2.变量的生存期和作用域

  • 生存期:什么时候这个变量开始出现了,到什么时候它消亡了
  • 作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
  • 对于本地变量,这两个问题的答案是统一的:大括号内——块

5.3.本地变量的规则

  • 本地变量是定义在块内的
  • 它可以是定义在函数的块内
  • 也可以定义在语句的块内
  • 甚至可以随便拉一对大括号来定义变量
  • 程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
  • 块外面定义的变量在里面仍然有效块里面定义了和外面同名的变量则掩盖了外面的
  • 不能在一个块内定义同名的变量
  • 本地变量不会被默认初始化
  • 参数在进入函数的时候被初始化了

6.函数庶事:函数细节问题

6.1.main()

  • mian() 也是函数 可以写成int main(void)
  • return 0; 函数返回0表示函数正常运行

6.2.外部变量与静态全局变量

  • 外部变量:本源文件中访问其他源文件的全局变量,可在本源文件中使用关键字extern来声明全局变量。
  • 静态全局变量:本源文件中的全局变量不需要在其他源文件中使用,可使用关键字static来定义该全局变量。

6.3.内部函数与外部函数

  • 函数默认属性为外部函数
  • 内部函数:如果函数只能被本源文件的函数调用,则称此函数为内部函数。在定义内部函数时,给函数定义前面加上关键字static
  • 外部函数:如果想在本源文件中调用其他源文件中定义的外部函数,可在本源文件中使用关键字extern来对函数进行外部声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值