Day8 内容梳理:
目录
Chapter 6 函数
6.0 概述
函数的分类(2种):
系统函数(库函数):由编译系统提供,用户无需自己定义即可直接使用。
用户定义函数:用户自命名的函数,发挥特定功能
函数的作用:
减少代码冗余;让代码更加模块化,有利于程序的阅读、修改和完善。
6.1 定义函数
定义的格式:
返回值类型 函数名(参数列表)
{
代码
return 0;
}
返回值的类型:
void:如果是void的话,可以不写return或写return;
返回值:如果函数返回值类型和return中的类型不一致,则以前者为准
定义函数的例子:
补充:在不同函数里的变量可以重名,因为作用域不同。
在各函数里定义的变量只会作用于本函数,执行完该函数,就从内存中删除。全局变量则不可以与局部变量重名。
6.2 调用函数
(1)实参 & 形参
参数分为两大类:实参和形参
实参有具体的值。
形参没有具体的值,只包含内存地址,其他参数可访问该内存地址。
在函数调用过程,传递的是实参,将具体的值通过定义的函数传递过去(比如main里面的a=10和b=20)
而在函数定义过程中,传递的是形参(比如add里面的a和b,只有数据类型而没有具体数值)
在函数调用结束,该函数(所有变量以及返回值)会在内存中被销毁,这是系统在自动维护内存。所以往往会用一个变量来暂存函数的返回值(比如上图中的int c = add(a, c); 但是对于没有返回值的函数,形参无法被赋值后传回给实参,如下。)
❗ 实参对形参的数据传递是单向传递,只能由实参传递给形参,不能由形参传回给实参。
例子:
在swap函数内部再打印一下a、b,能发现swap函数内的确发生了交换,但是参数的值没能从swap()中的形参a、b传递回main()里的实参a、b
打印语句中用了缩进,以区分main()和swap()中的变量a、b的数值
总结来看,再执行一个被调用的函数时,形参的值如果发生改变,则不会影响主函数中实参的值。
(2)调用无参函数
返回值类型处写void,以及参数列表为空
无参函数调用的例子:
(3)调用有参函数
参数列表中,各个参数之间用逗号隔开。
传递参数时,实参列表和形参列表的长度、类型应该相同,而且变量应该按顺序一一对应上。
实参可以是常量、变量或表达式。但无论是哪种类型,各参数都应在函数调用前被定义到、被赋到确定的值。
6.3 声明函数
如果定义的函数放在main()函数之前,则无需进行函数声明。反之则需要。
声明的格式:extern 数据类型 函数名(参数列表);
(可以忽略extern)
定义是一种特殊的声明。一般把需要分配存储空间的称为“定义”,把不需要分配的成为“声明”。
(对于int a,即是声明又是定义,而extern int b则是声明)
6.4 终止函数(exit & return)
在main()函数中调用exit和return都是终止程序。
在子函数中调用return只是终止子函数,但在子函数中调用exit则是终止整个程序。
6.5 多文件编程
(1)设置主文件
可以把多个文件放在一个项目中,但一个项目只能有一个主文件。
右键点击想要运行的文件,然后选择“设为启动项目”。
(图上这里我只有一个文件,名为“01_基础内容”。如果有多个文件,就能清楚地看到主文件的名字是加粗加黑的,其他文件的名字则是正常字体)
(2)创建头文件
可自定义一些头文件,右键点击“头文件”--“添加”--“新建项”,再点击选择“头文件(.h)”,如图所示。注意这里命名头文件一定是以XXX.h的格式。我命名为了“defined_head.h”。
成功创建头文件之后,最上方的#pragma once不可删去,目的是为了避免多个头文件之间出现互相包含的情况,会报错。
有两种避免重复包含的方法。
一种是:
#pragma once
//声明语句
另一种是:
#ifndef __全大写文件名_H__
#define __全大写文件名_H__
//声明语句
#endif
(3)导入头文件
标准库头文件的导入格式:#include <stdio.h>
自定义头文件的导入格式:#include “XXX.h”
例子:
一般是一个文件对应一个头文件,命名相似,比如01func.cpp对应01func.h
标签:头文件,函数,Day8,形参,笔记,C语言,return,实参,定义 From: https://blog.csdn.net/m0_75036068/article/details/140924838