C语言学习笔记之函数篇

        与数学意义上的函数不同,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;elsereturn 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.mzph.cn/news/172248.shtml

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

相关文章

React 入门使用 (官方文档向 Part2)

文章目录 用 State 响应输入声明式地考虑 UI步骤 1&#xff1a;定位组件中不同的视图状态步骤 2&#xff1a;确定是什么触发了这些状态的改变步骤 3&#xff1a;通过 useState 表示内存中的 state步骤 4&#xff1a;删除任何不必要的 state 变量步骤 5&#xff1a;连接事件处理…

TypeScript 中的type与interface

TypeScript 中的type与interface 对于 TypeScript&#xff0c;有两种定义类型的方法&#xff1a;type与interface。 人们常常想知道该使用哪一种&#xff0c;而答案并不是一刀切的。这确实取决于具体情况。有时&#xff0c;其中一种比另一种更好&#xff0c;但在许多情况下&a…

059-第三代软件开发-巧用工控板LED指示灯引脚

第三代软件开发-巧用工控板LED指示灯引脚 文章目录 第三代软件开发-巧用工控板LED指示灯引脚项目介绍巧用工控板LED指示灯引脚第一种方式第二种方式 总结 关键字&#xff1a; Qt、 Qml、 Power、 继电器、 IO 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项…

video标签在h5中被劫持问题

将video的视频链接转为blob export const encryptionVideo (options: URL) > {return new Promise((resolve, reject) > {window.URL window.URL || window.webkitURL;var xhr new XMLHttpRequest();xhr.open(GET, options.url, true);xhr.responseType blob;xhr.onl…

题解(讲题时备用):CF1896-D. Ones and Twos

题解(讲题时备用)&#xff1a;CF1896-D. Ones and Twos 题目链接 Problem - D - Codeforces。 思路简述 我们不难得出只要询问中s&#xff08;s>2&#xff09;行&#xff0c;s-2就也行。&#xff08;通过区间内的左端点和右端点上面的数可以得出&#xff09; 之后维护偶…

圆通速递单号查询入口,以表格的形式导出详细物流信息

批量查询圆通速递单号的物流信息&#xff0c;并以表格的形式导出单号的详细物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

C++初识类和对象

前言 上一期我们介绍了一些C入门的基础知识&#xff0c;本期我们来介绍面向对象。初步认识一下面向对象和面向过程、类、以及封装&#xff01; 本期内容介绍 面向过程和面向对象 类的引入 类的定义 类的访问限定符和封装 类的作用域 类的实例化 类对象模型 this指针 一、面向…

基本数据结构二叉树(1)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.5 二叉树的存储结构 2. 链式存…

【多线程】-- 03 龟兔赛跑案例线程创建方法之三:Callable接口

多线程 2 线程创建 【续】2.2 龟兔赛跑案例 首先需要一个赛道距离&#xff0c;然后会距离终点越来越近判断比赛是否结束打印出胜利者龟兔赛跑开始故事中是乌龟获胜&#xff0c;兔子需要睡觉&#xff0c;所以要模拟兔子睡觉最终&#xff0c;乌龟赢得比赛 package com.duo.de…

C语言数据类型和变量

# C语言数据类型和变量 # 数据类型介绍 C语⾔提供了丰富的数据类型来描述⽣活中的各种数据。使⽤整型类型来描述整数&#xff0c;使⽤字符类型来描述字符&#xff0c;使⽤浮点型类型来描述⼩数。所谓“类型”&#xff0c;就是相似的数据所拥有的共同特征&#xff0c;编译器只有…

[ruby on rails] array、jsonb字段

一、jsonb # 新增 add_column :shi_tis, :setting, :jsonb, default: {}# string转jsonb def changechange_column :users, :setting, :jsonb, using: setting::jsonb, default: {} end# 加索引 add_index :users, :setting, using: :gin # 这样就为setting jsonb字段创建了一…

TypeScript中的枚举是什么?

在TypeScript中&#xff0c;枚举&#xff08;Enum&#xff09;是一种用于定义一组有命名的常量值的数据类型。它们可以提供更具可读性和可维护性的代码。 枚举的作用是为一组相关的值提供一个易于理解和使用的命名空间。它们可以用于代表一系列可能的选项、状态或标志&#xf…

CMake Error:No targets specified and no makefile found

在适用cmake构建项目的时候&#xff0c;突然遇到了这个报错 Make Error at CMakeLists.txt:1 (project): VERSION not allowed unless CMP0048 is set to NEW – Configuring incomplete, errors occurred! make: *** No targets specified and no makefile found. Stop. CMake…

MySQL进阶知识

目录 MySQL的Linux安装 存储引擎 MySQL的体系结构 存储引擎简介 存储引擎特点 InnoDB 逻辑存储结构 MyISAM Memory 对比 存储引擎选择 索引 介绍 索引结构 BTree索引 Hash索引 索引分类 索引语法 SQL性能分析 SQL执行频率 慢查询日志 profile详情 expla…

CRC 循环冗余检测

目录 一、基础知识1.异或运算xor2.模2算术&#xff08;1&#xff09;模2加法和减法&#xff08;2&#xff09;模2乘法&#xff08;3&#xff09;模2除法 二、CRC循环冗余检测1.背景2.原理3.求R 一、基础知识 1.异或运算xor 异或&#xff0c;顾名思义&#xff0c;只有当两个数…

算法基础一

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 解题思路&#xff1a;这道题最优的做法时间复杂度是O(n)&#xff0c;顺序扫描数组&#xff0c;对每一个元素在…

Aibote4j java封装版本的

Aibote4j 交流Q群&#xff1a;496086899 开源地址&#xff1a;https://github.com/1341191074/aibote4j 更新yolo和ocr相关新增的能力&#xff0c;比较强劲了 下面是使用的案例 public class WebBotTest extends WebBot {public static void main(String[] args) {WebBotSer…

最新AI创作系统ChatGPT网站运营源码、支持GPT-4-Turbo模型,图片对话识图理解,支持DALL-E3文生图

一、AI创作系统 SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypescript框架技术&#xff0c;持续集成AI能力到本系统。支持OpenAI DALL-E3文生图&#xff0c;…

事件委派+自定义属性+编程式导航实现路由跳转及传参

当我们页面中有许多a标签需要实现点击跳转到同一个页面并携带不同的参数时&#xff0c;我们就可以使用事件委派自定义属性编程式导航 的方式&#xff0c;用最小的内存实现路由跳转的最大效率。 为什么我们不用router-link 进行跳转&#xff1f; 要知道&#xff0c;我们页面中…

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

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…