首页 > 其他分享 >函数的讲解

函数的讲解

时间:2024-07-23 13:25:55浏览次数:8  
标签:函数 形参 static 数组 讲解 实参 库函数

1. 函数的概念

2. 库函数

3. ⾃定义函数

4. 形参和实参

5. return语句

6. 数组做函数参数

7. 嵌套调⽤和链式访问

8. 函数的声明和定义

1. 函数的概念

C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码,这段代码是有特殊的写法和调⽤⽅法的。 C语⾔的程序其实是由⽆数个⼩的函数组合⽽成的。

2. 库函数

2.1标准库和头⽂件

我们前⾯内容中学到的 printf 、 scanf 都是库函数,库函数的也是函数,不过这些函数已经是现 成的,我们只要学会就能直接使⽤了。有了库函数,⼀些常⻅的功能就不需要程序员⾃⼰实现了,⼀ 定程度提升了效率;

库函数相关头⽂件:https://zh.cppreference.com/w/c/header

2.2库函数使用方法

2.2.1功能

Computesquareroot计算平⽅根

Returns the square root of x.(返回平⽅根)

2.2.2 头⽂件包含

库函数是在标准库中对应的头⽂件中声明的,所以库函数的使⽤,务必包含对应的头⽂件,不包含是可能会出现⼀些问题的

3.自定义函数

3.1函数语法形式

int是返回类型

fun_name是函数名

(  )中放的是形式参数

{  }括起来的是函数体

举例:

4. 形参和实参

4.1 实参

实际参数就是真实传递给函数的参数

例如上方 174-179行是 Add 函数的定义,有了函数后,再第188⾏调⽤Add函数的。 我们把第188⾏调⽤Add函数时,传递给函数的参数a和b,称为实际参数,简称实参。

4.2 形参

在上⾯代码中,第174⾏定义函数的时候,在函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简称形参

4.3 实参和形参的关系

0

x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不⼀样的,所 以我们可以理解为

形参是实参的⼀份临时拷⻉

5.return 语句

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

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

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

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

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

6. 数组做函数参数

举例 将一个数组里的数全部变成-1

知识点:

1.函数的形式参数要和函数的实参个数匹配 

2.函数的实参是数组,形参也是可以写成数组形式的 

3.形参如果是⼀维数组,数组⼤⼩可以省略不写 

4.形参如果是⼆维数组,⾏可以省略,但是列不能省略 

5.数组传参,形参是不会创建新的数组的 

6.形参操作的数组和实参的数组是同⼀个数组

7.嵌套调⽤和链式访问

7.1 嵌套调⽤

计算某年某⽉有多少天

main 函数调⽤ scanf , printf ,get_days_of_month

get_days_of_month函数调⽤ is_leap_year

7.2 链式访问

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

举例:

改写成

就是链式访问

8. 函数的声明和定义

8.1单个文件

上⾯代码中橙⾊的部分是函数的定义绿⾊的部分是函数的调⽤

如果把函数的定义放下面 编辑器会报错。

函数的调⽤⼀定要注意,先声明后使⽤

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

8.2 多个⽂件

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

8.3 static和extern

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

1.修饰局部变量

2.修饰全局变量

3.修饰函数

extern 是⽤来声明外部符号的

作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤) 的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。

1. 局部变量的作⽤域是变量所在的局部范围。

2. 全局变量的作⽤域是整个⼯程(项⽬)

⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。

1. 局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。

2. 全局变量的⽣命周期是:整个程序的⽣命周期。

8.3.1 static 修饰局部变量:

举例

对比结果发现

static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本 来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才 回收。但是作⽤域不变的

8.3.2 static修饰全局变量

⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤

8.3.3static 修饰函数

static 修饰函数和 static 修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤.

标签:函数,形参,static,数组,讲解,实参,库函数
From: https://blog.csdn.net/qq_74775863/article/details/140631397

相关文章

  • 如何通过函数注释指示函数需要函数作为参数,或返回函数?
    您可以在python3中使用函数注释来指示参数和返回值的类型,如下所示:defmyfunction(name:str,age:int)->str:returnname+str(age)#usefulfunction但是,如果您正在编写一个需要函数作为参数或返回一个函数的函数,该怎么办?我意识到您可以为注释编......
  • 如何输入注释reduce函数?
    我正在list之上编写一个非常薄的包装器,并且我想定义一个名为reduce的方法,但我正在努力正确注释它,以便pylance、mypy&pylint剪切它们每当我使用该方法,甚至定义它时,都会抱怨。我很不安地意识到,Python的内置库几乎没有类型注释。......
  • 简单讲解一下STM32的启动过程
    启动模式首先我们先看一下启动模式第一个为内部FLASH启动方式   当芯片上电后采样到BOOT0引脚为低电平时,0x00000000和0x00000004地址被映射到内部FLASH的首地址0x08000000和0x08000004。因此,内核离开复位状态后,读取内部FLASH117的......
  • C语言printf和scanf函数详解
    文章目录一、printf二、scanf一、printfprintf()的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的f代表format(格式化),表示可以定制输出⽂本的格式,并且它是一个库函数,要包含头文件<stdio.h>,具体包含方式如下:#include<stdio.h>printf最基本的用法:用双引号直接引起需要......
  • 使用递归函数计算阶乘时,我在 python 中遇到类型错误
    defcalc_fact(n):如果(n==1或n==0):返回1别的:n*calc_fact(n-1)print(calc_fact(5))试图创建函数来计算阶乘,不支持类型错误操作数*:对于int或Nonetype我不知道为什么谢谢Python代码中出现“类型错误:不支持的操作数类型为*:'int'和'NoneType'”表明你......
  • 类型错误:无法将函数返回值转换为 Python 类型!签名是 () -> 处理 anaconda spider
    这是代码:importosimportrandomimportnumpyasnpimportpandasaspdimporttensorflowastffromtensorflow.kerasimportbackendasKfromtensorflow.keras.layersimportDense,Dropout,Flatten,Conv2D,MaxPool2D,Input......
  • R语言数据可视化:使用ggplot2的geom_mark_ellipse函数圈定特定的数据簇或组
    在数据分析和可视化领域,R语言是一个非常受欢迎的工具,而ggplot2包则是R语言中最常用的数据可视化包之一,ggplot2包提供了丰富的函数和选项,用于创建高质量的统计图形,其中geom_mark_ellipse函数是一个强大的工具,可以用于圈定特定的数据簇或组,并突出显示它们的位置和关系。为了演示......
  • R语言中找不到函数“variable_response”的错误
    在R语言中,当你尝试调用函数"variable_response"时,如果系统提示找不到该函数,这意味着R无法找到对应的函数定义,这可能是因为你没有正确加载或安装包含该函数的库,或者函数名拼写错误。要解决这个问题,首先确保你已经正确安装了包含"variable_response"函数的库,你可以使用以下代码......
  • C++ 特殊成员函数的注意事项
    在C++中,特殊成员函数指的是编译器在某些特定情况下会自动生成的成员函数,包括默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数和移动赋值运算符。了解并正确使用这些特殊成员函数对于编写高效、可维护的C++代码至关重要。以下是一些关于这些特殊成员函数......
  • Rust 发散函数
    发散函数发散函数(divergingfunction)绝不会返回。它们使用!标记,这是一个空类型。fnfoo()->!{panic!("Thiscallneverreturns.");}和所有其他类型相反,这个类型无法实例化,因为此类型可能具有的所有可能值的集合为空。注意,它与()类型不同,后者只有一个可......