C语言学习笔记之函数篇

news2024/11/30 13:42:47

        与数学意义上的函数不同,C语言中的函数又称为过程接口,具有极其重要的作用。教科书上将其定义为:程序中的子程序

        在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性

        (一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库)

目录

函数分类

自定义函数

库函数

函数的参数

实际参数(实参)

形式参数(形参)

函数的调用

传值调用

传址调用

嵌套调用

链式访问

函数递归

函数的定义与声明

函数的定义

函数的声明

重点:


函数分类

        C语言的函数分为两类,一类是自定义函数,另一类则是库函数

自定义函数

        顾名思义,自定义函数就是自己定义的函数,函数定义的语法规则如下:

ret_type fun_name(para1, *)
{
	statement;//语句项
}
ret_type 返回类型(可以是内置类型,也可以是自定义类型,无返回值时为void)
fun_name 函数名(命名规则同变量命名规则,建议采用规范的命名方法如:大驼峰命名法,下划线命名法)
para1   函数参数(数量不限,但是不建议太多)

有返回值有参数:

#include <stdio.h>

int get_int_max(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}

int main()
{
	int x = 0; 
	int y = 0;
	scanf("%d%d", &x, &y);
	int max = get_int_max(x, y);
	printf("%d", max);
	return 0;
}

无返回值无参数:

#include <stdio.h>

void print_hello()
{
	printf("hello!\n");
}

int main()
{
	print_hello();

	return 0;
}

库函数

        在使用C语言编程时,几乎大量的用户都会使用某一个相同或者相似的功能,如:打印(printf),而每个人使用时都需要自己定义此功能模块,严重降低了编程的效率。为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。因此,对于库函数通俗的理解就是:别人已经替我们写好的,符合我们要求的,可以直接使用的函数(使用库函数必须包含对应的头文件)。(通过 www.cplusplus.com学习库函数,掌握学习库函数方法以及常用库函数即可)

        在日常工作生活中,库函数并不能满足我们的全部需求,因此总会需要我们自己去实现符合预期的功能和模块,这也是自定义函数存在的意义

库函数 strcpy 的学习和使用

#include <stdio.h>
#include <string.h>

int main()
{
	char ch1[] = "hello world\n";
	char ch2[15];
	char* ch3 = strcpy(ch2, ch1);

	printf("%s%s%s", ch1, ch2, ch3);
	return 0;
}

函数的参数

实际参数(实参)

        真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

形式参数(形参)

        形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

        (形参是实参的一份临时拷贝)(形参和实参可以同名)

函数的调用

传值调用

        函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

#include <stdio.h>

void modify_x(int x)
{
	x = 10;
}

int main()
{
	int x = 0;
	modify_x(x);

	printf("%d\n", x);

	return 0;
}

传址调用

        传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
        这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量(这也是为什么使用scnaf函数传参时需要 & )。(指针篇中详解)

#include <stdio.h>

void modify_x(int* x)
{
	*x = 10;
}

int main()
{
	int x = 0;
	modify_x(&x);

	printf("%d\n", x);

	return 0;
}

嵌套调用

        函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。函数内调用其他函数称为嵌套调用。

#include <stdio.h>

int add_x(int x, int y)
{
	return x + y;
}

int mult_x(int x) // x*x
{
	int i = 0;
	int num = x;
	for (i = 0; i < x - 1; i++)
	{
		num = add_x(num, x);
	}
	return num;
}

int main()
{
	int x = 0;
	scanf("%d", &x);
	int ret = mult_x(x);

	printf("%d\n", ret);

	return 0;
}

链式访问

        把一个函数的返回值作为另外一个函数的参数称为链式访问。

#include <stdio.h>

int add_x(int x, int y)
{
	return x + y;
}

int mult_x(int x) // x*x
{
	int i = 0;
	int num = x;
	for (i = 0; i < x - 1; i++)
	{
		num = add_x(num, x);
	}
	return num;
}

int main()
{
	int x = 0;
	scanf("%d", &x);

	printf("%d\n", mult_x(x)); //链式访问

	return 0;
}

函数递归

        程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
        递归的主要思考方式在于:把大事化小

        递归的两个必要条件(不满足则会出错):

        存在限制条件,当满足这个限制条件的时候,递归便不再继续。
        每次递归调用之后越来越接近这个限制条件。

#include <stdio.h>

void print(int x)
{
	if (x / 10 > 0)
		print(x / 10);

	printf("%d ", x % 10);

}

int main()
{
	int num = 12345;
	print(num);
	return 0;
}

程序执行流程:

函数的定义与声明

函数的定义

        函数的定义是指函数的具体实现,交待函数的功能实现。

函数的声明

        1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。

        2.编译器通过函数声明来寻找对应的函数。
        3. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
        4. 函数的声明一般要放在头文件中的。

void print(int x); // void print(int); (可以省略参数变量名,但不建议这么写)

重点:

        1.函数的定义也相当于一次声明,因此当我们的函数定义写在函数调用的前面(同一个文件)时不需要专门写声明也可以找到并调用函数。

        2.函数必须先声明后使用,否则编译器会找不到对应的函数而报错。

        3.C语言标准头文件中存放着标准库函数的声明,这也是为什么我们使用库函数时需要包含对应的头文件(C语言标准库文件中存放的是函数的具体实现细节即定义)。

        4.在实践中我们通常把函数的声明和定义分离,声明放到头文件中(.h后缀的文件),定义编译成二进制文件。目的:不想让别人清楚我们所实现的功能和模块的具体实现方法,只向外提供使用的接口和方法即声明和注释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

案例030:基于微信小程序的英语学习交流平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

关于 raw 图像的理解

1、问题背景 在图像调试过程&#xff0c;当发现一个问题时&#xff0c;很多时候都要通过 dump raw图像来分析&#xff0c;如果raw图像上有&#xff0c;那就排除了是 ISP的处理导致。 下一步就是排查 sensor 或者镜头&#xff0c;这样可以有效的帮我们定位问题所在。 但遇到过…

成为AI产品经理——TPR、FPR、ROC、AUC

目录 一、PR图、BEP 1.PR图 2.BEP 二、灵敏度、特异度 1.灵敏度 2.特异度 三、真正率、假正率 1.真正率 2.假正率 三、ROC、AUC 1.ROC 2.AUC 四、KS值 一、PR图、BEP 1.PR图 二分类问题模型通常输出的是一个概率值&#xff0c;我们需要设定一个阈值&#xff…

P16 C++构造函数

目录 前言 01 什么是构造函数呢&#xff1f; 02 非构造函数初始化变量 03 构造函数初始化变量 04 带参数的构造函数。 最后的话 前言 我们继续学习 C 的面向对象编程&#xff0c;本章主要是讲其中的 构造函数。 01 什么是构造函数呢&#xff1f; 构造函数基本上是一种特…

2023年最新Visual Studio下载安装以及C语言环境搭建教程(含C语言入门教程)

文章目录 写在前面C语言简介Visual Studio简介Visual Studio安装教程 C语言入门Visual Studio使用教程 写在后面 写在前面 2023年最新Visual Studio下载安装以及C语言环境搭建教程来啦&#xff01;一起来看看吧~ C语言简介 C语言是一种高级编程语言&#xff0c;由美国贝尔实…

卷积神经网络经典backbone

特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的特定特征或属性。 1.AlexNet paper&#…

NX二次开发UF_CURVE_ask_wrap_curve_parents 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curve_parents Defined in: uf_curve.h int UF_CURVE_ask_wrap_curve_parents(tag_t curve_tag, tag_t * defining_face, tag_t * defining_plane, tag_t * defin…

【单调栈】子数组的最小值之和

import java.util.Deque; import java.util.LinkedList;/** 参考链接&#xff1a;https://leetcode.cn/problems/sum-of-subarray-minimums/solutions/1930857/gong-xian-fa-dan-diao-zhan-san-chong-shi-gxa5/* https://leetcode.cn/problems/sum-of-subarray-minim…

gitee仓库使用教程

下载安装git&#xff1b;在本地项目文件夹右击鼠标点击Git Bash Here;输入git init&#xff0c;这个目录变成git可以管理的仓库&#xff0c;会出现一个.git文件夹&#xff0c;如果没出现的话需要选择“显示隐藏文件”&#xff08;不会的同学自行百度一下&#xff09; 4.绑定本地…

Figma 插件学习(二)- 常用属性和方法

一. 如何调试figma插件 Plugins > Development > Show/Hide console 打开控制台即可开始调试 二.节点类型 根据不同的节点类型&#xff0c;也是会有不同的方法和属性&#xff0c;介绍几个常用节点类型 1.FrameNode 框架节点是用于定义布局层次结构的容器。它类似于HTM…

高校大学校园后勤移动报修系统 微信小程序uniapp+vue

本文主要是针对线下校园后勤移动报修传统管理方式中管理不便与效率低的缺点&#xff0c;将电子商务和计算机技术结合起来&#xff0c;开发出管理便捷&#xff0c;效率高的基于app的大学校园后勤移动报修app。该系统、操作简单、界面友好、易于管理和维护&#xff1b;而且对后勤…

弹窗concrt140.dll丢失的解决方法,深度解析concrt140.dll丢失的原因

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示或者系统崩溃的情况。其中&#xff0c;concrt140.dll是一个常见的错误提示&#xff0c;这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍5种详细的解决方法&#xff0c;帮助您恢…

I/O多路转接之epoll

承接上文 I/O多路转接之poll-CSDN博客 简介 epoll的相关系统调用 epoll底层原理 编写epoll的server 重新回归一下epoll原理&#xff0c;LT&#xff0c;ET epoll改成ET工作模式 -- 初识(有bug) epoll初识 按照man手册的说法: 是为处理大批量句柄而作了改进的poll. 它是在2.5.4…

所有网站文本复制方法(知网、百度文库等)

实现文字复制自由 在肝学校结课论文是发现要用的论文文字都无法复制&#xff0c;所以想到了以前学到的一个方法&#xff0c;开始忘了&#xff0c;突然想起来&#xff0c;现在记录一下。 拿我现在肝的课程结课论文为例&#xff1a; 方法一 在谷歌浏览器的网址前面有一个列表一…

WebSocket了解

一.什么是WebSocket WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 二.websocket的原理 web…

持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例

动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用&#xff0c;测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式&#xff0c;来演示动态创建 …

[NOIP2006]明明的随机数

一、题目 登录—专业IT笔试面试备考平台_牛客网 二、代码 set去重&#xff0c;再利用vector进行排序 std::set是一个自带排序功能的容器&#xff0c;它已经按照一定的规则&#xff08;默认是元素的小于比较&#xff09;对元素进行了排序。因此&#xff0c;你不能直接对std::s…

2.5 逆矩阵

一、逆矩阵的注释 假设 A A A 是一个方阵&#xff0c;其逆矩阵 A − 1 A^{-1} A−1 与它的大小相同&#xff0c; A − 1 A I A^{-1}AI A−1AI。 A A A 与 A − 1 A^{-1} A−1 会做相反的事情。它们的乘积是单位矩阵 —— 对向量无影响&#xff0c;所以 A − 1 A x x A^{…

【挑战业余一周拿证】一、亚马逊云科技简介 - 第 2 节 - 模块 简介

CSDN 官方中文视频&#xff08;免费&#xff09;&#xff1a;点击进入 第 2 节 - 模块 1 简介 这门课程将为您提供需要了解的所有重要信息&#xff0c;让您能够轻松讨论亚马逊云科技并了解它为 何对您的企业有利 亚马逊云科技为每个企业都提供了非常广泛的服务&#xff0c;从…

Vscode工具使用指南

通用 快捷键文件 / 编辑查找 / 替换窗口插件主题 连接linux 快捷键 文件 / 编辑 新建文件&#xff1a;CtrlN放大或缩小&#xff1a;Ctrl /-代码行缩进&#xff0c;展开&#xff1a;Ctrl[ 和 Ctrl]在当前行下方插入一行&#xff1a;CtrlEnter在当前行上方插入一行&#xff1a;…