c语言基础~函数详解

前言

今天我们来学习一波函数的概念,帮助各位理解函数,本次博客取自一些书籍以及各大网站的讲解,把它整合在一起并且详细讲解

1函数的理解

我们得知道什么是函数,函数的作用是什么,好不会表述没关系,我们翻书

c primer plus 是这么说的"函数是指完成任务的独立程序代码单元"

函数的分类1 库函数    2 自定义函数
库函数分很多种 IO函数 字符串操作函数 内存操作函数 
时间/日期函数
数学函数(要用#include<math.h>) 其他函数
函数在c语言的专业名词为fuction
 

2自定义函数的语法

函数有什么呢

举个最简单的例子,看代码

//1函数的声明
int Add(int a,int b);
int main()
{
int a=10;
int b=20;
printf("%d",Add(a,b));//2函数的调用
return 0;
}
3函数的定义
int Add(int a,int b)//4有返回值的函数 返回类型为int
{
return a+b;
}

1函数的声明

函数的声明可以使编译器找到该函数,如果说自定义函数在main的后面并且没有声明,那么就会出现错误

举例吧

当只有一个自定义函数时,编译器并没有报错,但是是有警告的

>D:\c\haha\FileName.c(963,15): warning C4013: “Add”未定义;假设外部返回 int

其实在语法中这个是错误的,只不过编译器优化了

那么接着看 当我们调用两个自定义函数时

就会发生报错,解决方法很简单的

只要提前声明不就好了,让我们的编译器知道有这么一个函数不就好了

相信大家大家已经会解决这类问题了

2函数的定义

哎呀函数的定义不就是 函数的内容吗 {}就是花括号里头的内容,

当然我们发现在函数的声明中有两个参数 在定义的过程中

语法为 返回类型 函数名(类型 +变量名1,类型+变量名2````````)

我们从左往右看

返回类型分两个 一个是有返回值 通常的表述为类型 比如 int float double int*等等

另一个是无返回值 就直接是void 他们会返回一个值表示某些特殊的条件

大家也看到上面的代码中出现了

函数名就是他的名字 在C语言中函数名不可以重复,既自定义的函数不能与库函数同名

并且自己也不能写两个同名函数,在c++中是可以的,叫做函数重载,以后会提到

接着是参数,在函数声明中的参数叫做形参,而在调用中的参数叫做实参

3函数的调用

在函数的调用中就用讲头了, 1在函数的声明中有几个参数,我们在调用时就必须要使用

几个参数  2参数的类型必须一一对应不能乱传 3在调用时,函数的实参会被拷贝一份到形参中

但是形参的改变不会影响到实参

我们可以举例,还是用最简单的例子吧 交换 a b变量的值

void Swap(int a,int b)
{
int temp=a;
a=b;
b=temp;
}
int main()
{

int a=10;
int b=20;
Swap(a,b);
printf("%d %d",a,b);
return 0;
}

此时 a b的值并没有改变

解决方法也很简单

void Swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main()
{

int a=10;
int b=20;
Swap(&a,&b);
printf("%d %d",a,b);
return 0;
}

只需通过指针即可

其实这两种调用分别称为 传值调用和传址调用

3库函数

库函数顾名思义,就是在C语言库里的函数,他们已经被定义声明好了

我们只需拿来就用就好,为了方便大家理解

我们还是举例子说明

stdio库函数 printf scanf   io输入输出函数举例

#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("%d",a);
return 0;
}

strlen 库函数     全名string(字符) length(长度)所以该函数时计算字符串的长度 举例

  
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[]="hahahaha";
	int a = strlen(arr);
	printf("%d", a);
	return 0;
}

这个函数是计算字符串长度的函数(不包括\0)

math库函数 举个例子 floor sqrt

#include<stdio.h>
#include<math.h>
int main()
{

int a=10;
int b=floor(sqrt(10));
printf("%d",b);
return 0;
}

floor(a)返回一个不超过a的最大整数

sqrt(a)计算a的算术平方根

我们这里以三个最常用的库函数给大家举例

4函数的嵌套使用和链式访问

1嵌套使用

函数的内部可以再调用函数

举例

#include<stdio.h>
int main()
{
printf("%d",10);
return 0;
}

没想到吧这就是在主函数里调用库函数printf,可以说是最简单的例子了

2链式访问

把一个函数的返回值作为另一个函数的参数

看代码

提示printf函数的返回值为size_t类型  大小为打印的数量

#include<stdio.h>
int main()
{
	printf("%d",printf("%d",printf("%d",43)));
	return 0;
}

大家看的出结果吗答案是4321

43是两个占位符第一个内部的printf返回2,接着把2打印出来

又返回1,再把1打印出来

 5函数递归

运用自身的编程技巧称为递归(recursion)
把大型问题转化为小型问题

举例来看 看一看最简单的递归

void print();
void print()//结果是一直打印haha
{
	printf("haha");
	print();
}
int main()
{
	print();
	return 0;
}
//这就是最简单的递归函数,但此函数:如递归所有控件路径,函数将导致运行时堆栈溢出(stack overflow)

接下里再看代码

1.接受一个整形(无符号),按照顺序打印它的每一位


void NB(int x);
void NB(int x)
{
	if (x > 9)
	{
		NB(x/10);
	}
	printf("%d\n", x % 10);
}
int main()
{
	int n;
	scanf("%d", &n);
	NB(n);
	return 0;
}

看结果


 

说实话,如果不理解递归可以画图来理解

我们以上述代码结果例子来举例吧

1 接受一个值 123456

2进入函数 NB() 123456>9   执行NB(123456/10)12打印(123456%10)结束该函数

3第一次递归 12345>9    执行NB(1234)              11打印(12345%10)返回到原有的函数

4第二次递归1234>9   执行NB(123)                    10打印(1234%10)返回到第一次递归

5第三次递归123>9  执行NB(12);                       9打印(123%10)返回到第二次递归

6第四次递归12>9    执行NB(1)                          8打印(12%10)返回到第三次递归

7第五次递归1<9       打印(1 %10)返回到第四次递归来      

上面就是递归的全过程了

通过这个我们可以总结出两点
1.递归要有限制条件
2.每次递归要更接近条件


总结

今天的内容就到这里了,之后还是要多加练习,祝大家天天开心

上一张思维导图



 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】Servlet开发

目录 HttpServlet HttpServletRequest HttpServletResponse 错误页面 设置网页自动刷新时间 构造重定向相应 js发起http请求 服务器端对js发起的http请求进行处理 前端获取后端数据&#xff0c;添加到当前页面的末尾&#xff0c;代码示例&#xff1a; 前后端交互&…

24计算机考研调剂 | 【官方】山东师范大学(22自命题)

山东师范大学2024年拟接收调剂 考研调剂信息 调剂专业目录如下&#xff1a; 计算机技术&#xff08;085404&#xff09;、软件工程&#xff08;085405&#xff09; 补充内容 我校2024年硕士研究生调剂工作将于4月8日教育部“中国研究生招生信息网”&#xff08;https://yz.ch…

如何使用代理IP进行口子查和渠道查:代理IP使用方法

在进行问卷调查时&#xff0c;为了避免被限制访问或被封禁IP&#xff0c;使用代理IP已经成为了必要的选择。 其中&#xff0c;口子查和渠道查也不例外。 使用代理IP可以隐藏本机IP地址&#xff0c;模拟不同的IP地址&#xff0c;从而规避被封禁的风险。但是&#xff0c;对于很…

3.Gen<I>Cam文件配置

Gen<I>Cam踩坑指南 我使用的是大恒usb相机&#xff0c;第一步到其官网下载大恒软件安装包,安装完成后图标如图所示&#xff0c;之后连接相机&#xff0c;打开软件&#xff0c;相机显示一切正常。之后查看软件的安装目录如图&#xff0c;发现有GenICam和GenTL两个文件&am…

2024全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开 定制版红娘交友平台小程序源码&#xff0c;很牛逼的东西&#xff0c;虽然是小程序&#xff0c;但是有700多M大&…

【办公类-22-11】周计划系列(5-3)“周计划-03 周计划内容循环修改“ (2024年调整版本)

背景需求&#xff1a; 前文从原来的“新模版”文件夹里提取了周计划主要内容和教案内容。 【办公类-22-10】周计划系列&#xff08;5-2&#xff09;“周计划-02源文件docx读取5天“ &#xff08;2024年调整版本&#xff09;-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞29次&…

苍穹外卖-day10:Spring Task、订单状态定时处理、来单提醒(WebSocket的应用)、客户催单(WebSocket的应用)

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框…

el-form 的表单校验,如何验证某一项或者多项;validateField 的使用

通常对form表单的校验都是整体校验&#xff1a; this.$refs.form.validate( valid > {if (valid) {// 校验通过&#xff0c;业务逻辑代码...} }); 如果需要对表单里的特定一项或几项进行校验&#xff0c;应该如何实现&#xff1f; 业务场景&#xff1a;下图点探测按钮时…

高精度计算

主页&#xff1a;(*∇&#xff40;*) 咦,又好了~ xiaocr_blog &#xff08;1&#xff09;数据的接收方法和存储方法: 当输入的数据很长的时候&#xff0c;可采取字符串方式输入&#xff0c;这样可以输入位数很长的数&#xff0c;利用字符串函数和操作运算&#xff0c;将每一位…

复杂网络——半局部中心法

一、概述 由于最近写论文需要使用复杂网络知识中的半局部中心法&#xff0c;但是截止目前来说&#xff0c;网上几乎搜索不到有关的MATLAB程序代码&#xff0c;只有一篇用Python编写的程序&#xff0c;我的电脑中没有python&#xff0c;所以我花费一些时间&#xff0c;利用matla…

Excel数据可视化

饼图 1、选中数据----点击插入----点击饼图 2、更改数据标签&#xff08;修改标题名直接改就行&#xff09; 柱形图 1、选中数据、点击插入二维柱形图 坐标轴问题----切换行和列 如何将横轴变成想要的4、5、6、7月&#xff1f; &#xff08;1&#xff09;右键----选择数据 -…

计算机二级(Python)真题讲解每日一题:《十字叉》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ ‪‬‪‬‪‬‪‬‪‬‮‬‪…

Java解决完全二叉树的节点个数

Java解决完全二叉树的节点个数 01 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的…

202303 CSP认证 | LDAP

LDAP 好好好&#xff0c;难度直线上升&#xff0c;是一道又有了字符串处理味道的第三题 第一把写官网40分&#xff0c;acwing TLE且只通过了一道数据…本文是自己这题奋斗过程 的一个记录 先贴个40分的代码&#xff1a; #include<bits/stdc.h> using namespace std; t…

计算机网络:性能指标

计算机网络&#xff1a;性能指标 速率带宽吞吐量时延时延带宽积往返时间利用率丢包率 本博客介绍计算机网络的性能指标&#xff0c;我们可以从不同的方面来度量计算机网络的性能。常用的计算机网络性能指标有以下 8 个&#xff0c;他们是&#xff1a;速率、带宽、吞吐量、时延、…

Android弹出通知

发现把Android通知渠道的重要性设置为最高时&#xff0c;当发送通知时&#xff0c;通知能直接弹出来显示&#xff0c;以前一直搞不明白为什么别的app的通知可以弹出来&#xff0c;我的不行&#xff0c;搞了半天原来是这个属性在作怪&#xff0c;示例如下&#xff1a; class Ma…

Flink源码解析(1)TM启动

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

CMake学习(上)

1. CMake概述 CMake 是一个项目构建工具&#xff0c;并且是跨平台的。关于项目构建我们所熟知的还有Makefile&#xff08;通过 make 命令进行项目的构建&#xff09;&#xff0c;大多是IDE软件都集成了make&#xff0c;比如&#xff1a;VS 的 nmake、linux 下的 GNU make、Qt …

论文解读之Attention-based Deep Multiple Instance Learning

前言 多实例学习是由监督学习演变而来的&#xff0c;我们都知道&#xff0c;监督学习在训练的时候是一个实例&#xff08;或者说一个样本、一条训练数据&#xff09;对应一个确定的标签。而多实例的特点就是&#xff0c;我们在训练的时候的输入是多个实例对应一个确定的标签&a…

STM32使用常见错误合集(正在更新版)

本文章记录一些学习STM32的一些错误问题 一、编译、烧录类问题 1、烧录不成功&#xff0c;Keil提示RDDI-DAP Error【场景&#xff1a;PWM驱动直流电机】 解决方案&#xff1a;将电机断开再进行烧录&#xff0c;断开后就可以美美烧录不报错啦~ 二、Keil使用问题 1、打开一个…