【C语言】函数详解

C语言学习-11 本章介绍以下内容:函数:gets()、gets_s()、fgets()、puts()、fputs()、strcat()、strncat()、strcmp()、strncmp()、strcpy()、strncpy()、spritf()、strchr() 创建并使用字符串 使用C库中的字符和字符串函数、并创建自定义的字符串函数 使用命令行参数。字符串是C语言中最有用、最重要的数据类型之一。虽然我们一直在使用字符串,但是要学的东西还很多。C库提供大量的函数用于读写字符串、拷贝字符串、比较字符串、合并字符串、查找字 阅读详情

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️小林爱敲代码
      🛰️专栏:✈️C语言快速入门
      🛰️欢迎关注:👍点赞🙌收藏✍️留言
在这里插入图片描述

      这篇文章给大家介绍C语言中函数的使用,本来打算昨天为大家更新的。但是阳了,早上刚挂完点滴,就跑来更新博客了。🌺🌺

  
      每日一句: 成功不是将来才有的,而是从决定去做的那一刻起,持续积累而成。

大纲:

![

函数内容的大纲:
在这里插入图片描述

💖7 函数

函数有2类,一类是库函数,一类是自定义函数,库函数就是C语言为我们提供的。例如我们常用的 printf(),scanf(),这些都是C语言为我们提供的库函数。自定义函数则是我们自己定义的函数,自己定义,自己调用。

💪7.2 函数的声明和定义

🔮7.2.1 函数的声明

函数的声明定义格式为: 返回值类型 函数名(参数列表);
返回值类型:就是数据类型,如果没有返回值类型则用void。
函数名:随意,但在C语言中,函数名不能重复。
参数列表:就是传给函数的数据。

以下是函数声明的例子:

#include <stdio.h>

//一个无返回值,无参数的函数声明
void a();

//一个无返回值,有1个int参数的函数声明
void b(int a);

//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);

int main()
{
	return 0;
}

函数的声明一般会放在.h的头文件中。

🔮7.2.2 函数的定义

函数声明之后,我们需要定义。定义的话就直接把声明函数展开。
函数的定义格式为: 返回值类型 函数名(参数列表) { 函数体;}

函数定义如下:

#include <stdio.h>

//一个无返回值,无参数的函数声明
void a();

//一个无返回值,有1个int参数的函数声明
void b(int a);

//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);

//函数a的定义
void a()
{
	printf("a");
}

//函数b的定义
void b(int a)
{
	printf("b");
}

//函数c的定义
int c(int a, double d)
{
	printf("c");
	//有返回值必须返回一个值
	return 0;
}

int main()
{
	return 0;
}

当然,函数在定义的时候,如果未声明,会自动声明。
所以也可以这样:

#include <stdio.h>

//函数a的定义,前面未声明在此处自动声明
void a()
{
	printf("a");
}

//函数b的定义,前面未声明在此处自动声明
void b(int a)
{
	printf("b");
}

//函数c的定义,前面未声明在此处自动声明
int c(int a, double d)
{
	printf("c");
	//有返回值必须返回一个值
	return 0;
}

int main()
{
	return 0;
}

那么问题来了,既然定义时候会自动声明,那为什么还要声明呢?这是因为文件扫描是从上往下的,如果发现调用了一个函数,可函数在下面实现。那么就无法识别到这个函数。
例如:

#include <stdio.h>

//函数a的定义
void a()
{
	printf("a");
}

int main()
{
	
	a();//调用函数a

	return 0;
}

这个代码因为定义在main函数的前面,所以可以调用。但是如果定义在main函数的下面,那么main函数调用a函数时,无法识别到a,就会出错。

#include <stdio.h>

int main()
{
	
	a();//调用函数a

	return 0;
}

//函数a的定义
void a()
{
	printf("a");
}

在这里插入图片描述
所以这时候加上声明,就可以正常运行了。
在这里插入图片描述

💪7.3 函数的调用和传参

🔮7.3.1 函数的调用

函数的调用很简单,上面就有演示。
函数的调用格式: 函数名(参数列表);
参数列表要和函数定义时的参数列表匹配
函数调用的例子:

#include <stdio.h>

//函数 a没有参数
void a()
{
	printf("a");
}
//函数 b有1个int参数
void b(int b)
{
	printf("b");
}

int main()
{
	
	a();//函数名(参数列表); 但是函数a没有参数,所以不用传参
	b(1); //函数名(int); 因为函数定义时有1个int类型参数,所以必须传1个int类型
	return 0;
}

🔮7.3.2 函数的传参

函数的传参上面调用b时也演示过了,就是根据函数定义(声明)时的参数列表一一对应传参。所以再为大家提供几个传参例子。

#include <stdio.h>

//参数列表 (int)
void b(int b)
{
	printf("b");
}

//参数列表 (int,double,char)
void c(int a,double b , char c)
{
	printf("b");
}


int main()
{
	b(1);//传参列表(int)
	c(1,1.1,'a'); //传参列表(int,double,char); 
	return 0;
}

不过需要注意的是, 传参给函数的参数叫实参。而函数接收的参数叫形参,形参是实参的临时拷贝,改变形参不会影响实参的值。

#include <stdio.h>

//参数列表 (int)
void b(int c)
{
	c = 5;
}

int main()
{
	int c = 2;
	b(c);//传参列表(int)
	printf("%d ", c);
	return 0;
}

如图,C的值并没有发生改变
在这里插入图片描述

💪7.4 函数的返回值

当你期待一个函数会返回你一个特定的值时,你可以选择带返回值的函数。如果没有返回值,那么返回值的类型就是void。

假设我要实现一个Add函数,用来求2个数的和。

#include <stdio.h>

//返回值的数据类型为int
int Add(int x, int y)
{
	int z = x + y;
	return z;
}

int main()
{
	int z = Add(3, 5); //用 z 来接收函数的返回值
	printf("%d ", z);
	return 0;
}

在这里插入图片描述

💪7.5 函数的传址调用

如果我们期望改变实参的值,我们可以选择传址调用,传址调用就是传指针给函数。然后函数对指针指向的空间进行操作。

#include <stdio.h>
void Swap(int* a,int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("%d,%d\n", a, b);
	Swap(&a, &b);//传a和b的地址进去
	printf("%d,%d\n", a, b);

	return 0;
}

我们会发现a 和 b 的值发生了变化。因为我们给函数传的是 a 和 b的地址,而函数内部通过对a 和 b 解引用找到 a和b所在的内存空间。从而让它们进行交换。
在这里插入图片描述

💪7.6 函数的嵌套调用

函数的嵌套调用,就是我们在另外一个函数调用其他函数。

#include <stdio.h>

void b()
{
	printf("b\n");
}

void a()
{
	printf("a\n");
	b(); //a函数里面调用 b函数
}

int main()
{
	a();//main函数里面调用函数a
	return 0;
}

在这里插入图片描述
所以,函数也是可以嵌套调用的。

💪7.7 函数的递归

递归,栈溢出的罪魁祸首!什么是递归呢?简单来说,就是函数自己调用自己本身。比如以下代码,main函数一直调用自己。如果没有递归的终止条件的话,那么就会出现栈溢出。

#include <stdio.h>

int main()
{
	main();
	return 0;
}

在这里插入图片描述

所以在使用递归时,我们需要注意两点,一点是递归的结束条件,还有一点就是这个条件每递归一次都要发生变化。

比如我想实现一个函数,要求把一串数字倒着输出。

#include <stdio.h>

void a(int n)
{
	//当n=0时,递归终止
	if (n == 0)
	{
		return;
	}
	printf("%d ", n % 10);
	//自己调用自己
	a(n / 10);
}

int main()
{
	int n = 12345;
	a(n);
	return 0;
}

在这里插入图片描述

以上程序的递归展开图:
在这里插入图片描述

结言🥳:

💦💦如果有写的不好或者错误的地方,希望大家指证出来,我会不断的改正自己的错误。💯💯如果感觉写的还可以,可以点赞三连一波哦~🍸🍸后续会持续为大家更新大纲上的内容,以及数据结构,C++,Linux操作系统等方面的知识,本人会坚持持续更新。

🌺🌺拖着发烧的身体也要更新!你们的支持是我最大的动力,希望在往后的日子里,我们大家一起进步!!!
🌺🌺

【详解C语言】函数 C语言和函数相关的基础知识 阅读详情

相关推荐

C语言函数指针详解

C语言函数指针 一、什么是函数指针 1.理解函数指针 ​ 函数指针,首先根据他的名称我们就大概可以了解到他是一个指针,是什么样的指针呢?是和函数有关的一种特殊的指针。 ​ 我们知道 int*p 是指向int型变量的指针,char*p是指向char型变量的指针,那么不难理解,函数指针就是一个指向函数的指针。 int arr[10]={0}; int *p = arr; ​ 我们知道,在数组中数组名就是首元素的地址。 ​ 那么试着猜猜看,函数的地址是什么样的情况呢。 ​ 我们不妨打印一下看看结果是什

gjr2333的博客 4359

NSSCTF逆向刷题记录

首先是将ax清零,然后从数据段中拿出数据,向左偏移4,压入栈中,再清零ax,再从数据段中拿出数据,再向右偏移4,将栈中的数据拿出给bx,ax+bx,再拿ax与 (十六进制的17)23进行异或。函数接受两个参数:第一个参数是要转换的字符串,第二个参数是转换后的进制数,将二进制字符串转换为整数。中的每个字符转换为对应的 8 位二进制字符串,并将它们拼接在一起,得到一个长度为。得到s中字符在s_box中对应的索引所组成的序列。最开始的key为,为最简单的异或运算。pyinstxtractor解包。

fivesheeptree的博客 926

gmp用户手册

linux gmp原版英文用户手册gmp大数库

ctf密码学python重要函数使用(部分)+流量分析发现秘钥

ctf密码学python重要函数使用(部分)+流量分析发现秘钥

weixin_55631415的博客 1583

【AI Infra】【RLHF框架】VeRL中WorkerGroup与Ray资源调度的协同机制剖析

本文深入剖析了VeRL框架中WorkerGroup与Ray资源调度的协同机制。通过解析Ray Placement Group的资源抽象和VeRL的RayResourcePool封装,详细阐述了WorkerGroup如何与底层资源精确绑定,并实现RLHF训练中异构、多阶段任务的灵活资源分配与动态调整,为大规模分布式强化学习训练提供了高效解决方案。

weixin_29204205的博客 391

2021年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。现在从m位中删除k位(0

人生就是一个不断学习的过程 1011

C语言中信号量的使用

在操作系统理论课上,其实讲授了信号量的原理和使用方式以及使用信号量的优点。相信看到这篇文章的人已经对信号量底层实现机制有了一定的了解,这里就不再过多赘述。本文主要以两个题目为例来讲授信号量如何在高级语言中使用。如果不想费力去弄懂信号量,又想要写并发程序,可以参考go语言。 goroutine机制https://blog.youkuaiyun.com/prestyan/article/details/124366846?spm=1001.2014.3001.5501 与信号量紧密相关的两个操作是P,V操作,一些书中还

prestyan的博客 6106

基于simulink创建一个针对双馈异步风力发电机并网运行的仿真模型

摘要:本文详细介绍了基于Simulink的双馈异步风力发电机(DFIG)并网运行仿真建模方法。系统包含风速输入、风力机、双馈发电机、电力电子变换器、控制器和并网接口等模块,通过8个步骤完整呈现了建模流程,包括风速模拟、机械功率计算、发电机特性建模、变流器控制策略设计等关键环节。仿真可评估系统在不同风速条件下的动态响应、最大功率跟踪能力和发电效率,为风力发电系统的优化设计提供有效验证手段。模型可根据实际需求扩展环境因素和电网交互等细节,提高仿真精度。

amy_mhd的博客 335

C语言函数详解

函数作为C语言的基本组成元素,让我们深入认识这个熟悉又陌生的朋友

qq_65285898的博客 8万+

机器人全局路线规划导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对全局路线规划导读做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1504

汽车LIN总线(3) -- 协议层:帧的类型

主要介绍LIN协议层中帧的类型,介绍中加入一点自己的理解(带下划线的是,其余是官方资料)。

晴朗luo的博客 889

C语言中的函数(详解)

详细讲解初学者会遇到的函数问题,干活满满。

m0_63562631的博客 4万+

OData 请求里的 Nextlink 实战:在 ABAP Client Proxy 中优雅处理长列表分页

本文介绍了OData v4标准中的@odata.nextLink分页机制及其在SAP ABAP中的实践应用。重点解析了该机制通过服务端提供的完整URL实现分页获取,客户端只需循环处理直到该字段消失的特点。文章提供了清晰的ABAP代码模板,展示如何通过Remote Client Proxy实现分页数据获取,并强调了仅支持OData v4和远程消费的限制条件。通过HR员工数据聚合的实际案例,说明了流式分页处理的最佳实践,包括服务端过滤、稳定排序和内存控制等关键技术要点,为ABAP开发者提供了可直接落地的解决方案

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

C语言—函数详解

函数,也被称作子程序C语言中的函数就是一个完成某项特定的任务的一小段代码这段代码是有特殊的写法和调用方法的,由一个或多个语句块组成,具备相对的独立性。库函数和自定义函数二、库函数2.1 定义库函数,一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数库函数作为存放在函数库中的函数,具有明确的功能、入口调用参数和返回值,是一段可以重复使用的代码,用来独立地完成某个功能2.2 使用。

2301_79227649的博客 1649

【用unity实现100个游戏之2】复刻实现经典2d平台跳跃游戏《蔚蓝 Celeste》(附工程源码)

蔚蓝》是一款备受好评的独立游戏,由游戏开发工作室开发并由发行。这款游戏于2016年首次发布,并在玩家和评论界收获了广泛赞誉。蔚蓝以其独特的艺术风格和引人入胜的故事而著称。游戏以深海为背景,玩家将扮演一个能够探索水下世界的神秘生物。游戏通过惊人的视觉表现和动态的海洋生态系统为玩家带来了令人难忘的游戏体验。无论是广阔的水下景观还是充满生机的海洋生物,蔚蓝都让玩家感受到深海的神秘和美丽。蔚蓝在玩法上注重探索和解谜。玩家可以在海底环境中自由游动,发现隐藏的地点和秘密,与各种生物互动,并解决环境谜题以继续前进。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4169

目标跟踪与视频时序分析基础

两帧均有目标,却因快速移动导致检测框无重叠,仅靠交并比(IoU)无法维持身份关联。本文通过手算与纯Python实现最小跟踪流程,揭示IoU仅为位置线索,不能应对快速位移或遮挡。实验表明,即使目标真实存在,低重叠也会触发新编号。强调跟踪需结合运动预测、外观特征与阈值验证,避免误判。

Mr数据杨 2335

C语言函数详解大全

如果库函数能干所有的事情,那还要程序员干什么?所以这就引出自定义函数这一相关概念。自定义函数:与库函数一样,有函数名,函数参数,返回类型。不过相较于库函数,自定义函数就需要我们自己来设计,根据自己的需求设计出相关的函数。这就给了程序员很大的发挥空间。statement;// 语句项ret_type -> 返回类型funname -> 函数名paral1/paral2 -> 函数参数举个小梨子:写一个函数求出两个数的和。// get_sum的设计int main()

2302_78684687的博客 4889

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C语言】函数详解(入门到进阶)

函数,是C语言程序的重要组成部分之一,本文介绍了函数的定义以及函数的使用,包含代码示例,从零到一详细解读

zhh763984017的博客 6027

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C语言函数的详解

本章所讲解的主要有八大模块: 目录 一.函数是什么 二.库函数 三.自定义函数 四.函数参数 五.函数调用 六.函数的嵌套调用和链式访问 七.函数的声明和定义 其中,函数递归将在下一篇单独讲解。这一篇只讲前7个模块 一.函数是什么 数学中我们经常会见到函数的概念,但是了解C语言中的函数吗? 我们看维基百科对它的定义: ·在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, cal

weixin_47257473的博客 1950

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C语言-入门级别函数详解

C语言-入门级别函数详解,快速了解函数的定义和使用

YU-fect的博客 6130

C语言函数返回值详解

函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句的一般形式为: return 表达式; 或者: return (表达式); 有没有( )都是正确的,为了简明,一般也不写( )。例如: return max; return a+b; return (100+200); C语言返回值 1 . 没有返回值的函数为空类型,用...

weixin_45743799的博客 4万+
上一篇: 【C++】C程序和C++程序之间的互相调用
下一篇: 【C++】STL---string类的模拟实现
林   子
博客等级 码龄4年 2671粉丝 64原创
评论 58
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林 子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值