完全自学C(干货) —— 函数

Calibre PEX提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南) 本文深入解析Calibre PEX工具中hcell与xcell文件的协同工作机制,提供模块级寄生参数提取方案。通过实战案例和避坑指南,帮助工程师精准屏蔽已验证IP模块,提升仿真效率和数据一致性,适用于65nm以下工艺节点的复杂SoC设计。 阅读详情

目录

一,函数声明与定义

二,函数的分类

三,函数参数

四,函数的调用

五,函数的嵌套调用和链式访问

六,案例


  • 即子程序,是大型程序中某部分代码,由一个或多个语句块组成,通常被集成为软件库;
  • 负责完成某项特定任务,相较于其他代码具有独立性;
  • 一般会输入参数并返回值,提供对过程的封装和细节的隐藏;

一,函数声明与定义

函数的组成:包含函数名,返回值类型,函数参数及函数体;

//int 返回值
//Add 函数名
// int x/int y 参数
int Add(int x, int y)
{
    //函数体
	return x + y; 
}

函数声明

  • 告诉编译器,此函数的返回类型、函数名、参数类型,不关心是否存在;
  • 函数要满足先声明后使用;
  • 一般放在头文件内;
//头文件Add.h
//函数声明
int Add(int x, int y);

函数定义

  • 指函数具体实现的内容;
  • 定义时不开辟空间,只有调用时才开辟空间;
  • 注:不写函数返回类型,默认是返回int类型;
int Add(int x, int y)
{
	return x + y; 
}
int main()
{
	int a = 10;
	int b = 20;
    int Add(int, int); //如未声明,可能会报Add未定义错误;
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

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

二,函数的分类

  • 库函数
  • 自定义函数

库函数

在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发;

常用库函数

  • io函数,输入输出函数printf/scanf/getchar/putchar等;
  • 字符串操作函数,strcmp/strlen等;
  • 字符操作函数,toupper等;
  • 内存操作函数,memcpy/memset/memcmp等;
  • 时间/日期函数,time等;
  • 数学函数等,sqrt/pow等;

注:使用库函数时,需引用对应的头文件,以#include开头;

#include <stdio.h> //printf库函数引用
#include <string.h> //strcpy库函数引用
int main()
{
	char str1[10] = { 0 };
	char str2[] = "abcde";
	printf("%s", strcpy(str1, str2));
}
//结果:abcde

库函数网站

自定义函数

与库函数一样,但是有程序员自己设计的;

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

int Sub(int x, int y)
{
	return x - y; 
}

三,函数参数

  • 实际参数,简称实参;
  • 形式参数,简称形参;

实际参数

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

形式参数

  • 是指函数名后括号中的变量;
  • 形式参数只有在函数被调用的过程中才实例化(分配 内存单元),所以叫形式参数。
  • 当函数调用完成之后,形式参数就自动销毁了;
int Add(int x, int y) //x/y为形参
{
	return x + y;
}

int main()
{
	int a = 1;
	int b = 2;
	int c = Add(a, b); //a/b为实参
	printf("%d", c);
	return 0;
}

注:形参实例化之后其实相当于实参的一份临时拷贝;

四,函数的调用

  • 传值调用
  • 传址调用

传值调用

  • 形参实例化时,将实参的值,赋予给函数的参数;
  • 因为函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参;
int Add(int x, int y) //x/y为形参
{
	return x + y;
}

int main()
{
	int a = 1;
	int b = 2;
	int c = Add(a, b); //a/b为实参,调用时直接将1赋予x,2赋予给y,即传值调用
	printf("%d", c);
	return 0;
}

传址调用

  • 形参实例化时,将实参的内存地址,赋予给函数的参数;
  • 因为函数的形参和实参是同一块内存,对形参的修改会影响实参;
  • 即函数内部可直接修改函数外部的变量;
int Add(int* x, int* y) //x/y为形参
{
	return *x + *y;
}

int main()
{
	int a = 1;
	int b = 2;
	int c = Add(&a, &b); //a/b为实参,调用时直接将a的地址赋予x,b的地址赋予给y,即传址调用
	printf("%d", c);
	return 0;
}
void Swap(int* x, int* y) //x/y为形参
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
	int a = 1;
	int b = 2;
	Swap(&a, &b); //a/b为实参,调用时直接将a的地址赋予x,b的地址赋予给y,即传址调用
	printf("%d %d", a, b); //通过地址可修改函数外变量
	return 0;
}

五,函数的嵌套调用和链式访问

函数的嵌套调用

  • 函数定义时,可以包含其他已定义好的函数调用,形成嵌套;
  • 函数定义时,可以包含自身函数的调用,形成的嵌套即为递归;
//嵌套调用
void Swap(int* x, int* y) 
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int DividSwap(int x, int y)
{
	Swap(&x, &y); 
	return x / y;
}

int main()
{
	int a = 1;
	int b = 2;
	printf("%d", DividSwap(a, b)); 
	return 0;
}
//结果:2

链式访问

  • 把一个函数的返回值作为另外一个函数的参数;
int Add(int x, int y) 
{
	return x + y;
}

void print(int x)
{
	printf("%d\n", x);
}

int main()
{
	int a = 1;
	int b = 2;
	print(Add(a, b)); //链式访问
	return 0;
}
int main()
{
	printf("%d", printf("%d", printf("%d", 43))); //4321
	return 0;
}

六,案例

  • 判断素数
#include<stdio.h>
#include<math.h>

int is_prime(int num)
{
	int i = 0;
	for (i = 2; i <= sqrt(num); i++)
	{
		if (num % i == 0)
			return 0;
	}
	return 1;
}

int main()
{
	for (int i = 100; i <= 200; i++)
	{
		if (is_prime(i))
			printf("%d ", i);
	}
	return 0;
} 
  • 判断闰年
#include<stdio.h>

int is_leap_year(int n)
{
	return n % 4 == 0 && n % 100 != 0 || n % 400 == 0;
}

int main()
{
	int year = 0;
	for (year = 1000; year < 2000; year++)
	{
		if (is_leap_year(year))
			printf("%d ", year);
	}
	return 0;
}
  • 查找有序数组中的某个数
#include<stdio.h>

int binary_search(int* arr, int key, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < key)
			left = mid + 1;
		else if (arr[mid] > key)
			right = mid - 1;
		else
			return mid;
	}
	return -1;
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int key = 7;
	int sz = sizeof arr / sizeof arr[0];
	//找到返回下班,找不到返回-1;
	printf("%d\n", binary_search(arr, key, sz));
	return 0;
}
  • 每调用一次函数num加1
void add(int* num)
{
	(*num)++;
}

int main()
{
	int num = 0;
	add(&num);
	printf("%d", num);
	return 0;
}

Stata做DID平行趋势检验,用coefplot画图时遇到的3个坑及解决办法 本文详细解析了使用Stata进行DID平行趋势检验时,利用coefplot绘图可能遇到的三个常见问题及其解决方案。包括基线期选择陷阱、置信区间变形和图形元素错位,提供专业调试步骤和高阶技巧,帮助研究者高效完成学术级图表绘制。 阅读详情

相关推荐

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2024】_再现性;深度学习

coderVAEVAEVAE) (Kingma威林,2014)在概率性的工作方式学习观测数据之间的映射空间x∈Rmx∈R^mx∈Rm 和潜在的空间z∈Rnmnz∈Rn(m>>n)。作为一个潜变量模型,VAEVAEVAE制定这个问题作为观察样品的最大化对数似logpxlog∫px∣zpzdzpx∣zp (x | z)p(x∣z)可以很容易地使用神经网络建模,和pzp (z)

2401_84181704的博客 1242

【头歌-Python】 函数自学引导

函数引导自学 本文提供了第一章中 9 题的 题目、示例、参考代码。

谛凌的博客 2万+

从Cartographer3D到LIO-SAM:主流3D激光SLAM算法怎么选?一份给机器人工程师的实战避坑指南

本文深入探讨了从Cartographer3D到LIO-SAM等主流3D激光SLAM算法的选型策略,为机器人工程师提供实战避坑指南。通过对比不同算法在传感器配置、环境特性和计算资源等方面的表现,帮助开发者根据项目需求选择最优方案,并分享传感器标定、资源优化等实用技巧。

weixin_27310985的博客 154

c语言学习笔记之函数初步

(1)指定函数的名字(2)指定函数的类型,即函数返回值的类型 a.有(一个值)b.无 void没有或多个值(3)指定函数的参数名字和类型(4)指定函数应当完成什么操作,即函数的功能。

2403_87451845的博客 372

麒麟 ARMv10 SP3 安装 Oracle 19c 官方文档 或 教程

在麒麟ARMv10 SP3系统上安装Oracle 19c需要特别注意架构兼容性。

qq_43032338的博客 2938

图像配准(Image Registration)——深度学习方法

参考:https://www.cnblogs.com/carsonzhu/p/11188574.html

m0_46483236的博客 4万+

C语言函数

目录前言一、函数是什么?二、库函数三、函数的参数1.实际参数(实参)2.形式参数(形参):四、函数的调用1.传值调用2.传址调用五、函数的嵌套调用和链式访问1.嵌套调用2.链式访问六、函数的声明和定义1.函数声明:2.函数定义七、函数递归1.什么是递归2.递归的两个必要条件练习1.简单递归2.递归和迭代提示 前言 主要关于C语言函数的内容。 一、函数是什么?   函数是子程序,是一个大型程序中的某部分代码,由一个或多个语句块组成。他负责完成某项特定任务,相较于其他代码,具备相对的独立性。 二、库函数 1.为

mz474920631的博客 774

Jenkins Job DSL:用代码管理CI/CD配置的实践指南

Jenkins 是持续集成(CI)领域的经典开源平台,其核心价值在于自动化构建与交付流程。然而传统 UI 配置方式导致配置不可版本化、难以复现、审计困难,严重制约团队规模化协作效率。Job DSL 作为一种声明式配置即代码(IaC)方案,通过 Groovy 脚本驱动 Jenkins 内部 API,实现 Job、View、Folder 等资源的程序化创建与维护,天然支持 Git 版本控制、权限审计与环境一致性保障。它不替代 Pipeline,而是与其协同构成‘流程定义’与‘基础设施定义’双轨体系,显著提升 C

weixin_33744141的博客 518

完全自学C(干货) —— 库函数qsort

库函数qsort的模拟实现!

NapoleonCoder的博客 278

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

Coding... 2851

超硬核实操!DeepSeek 全方位赋能嵌入式工程师,干货满满

摘要:本文聚焦 DeepSeek 大语言模型在嵌入式开发中的实操应用。开篇阐述其在开发前期助工程师精准理解需求、规划架构;代码编写阶段,可生成补全代码、助力算法实现与优化;调试测试时,能定位问题、生成测试用例;学习阶段,帮整理资料、规划学习路径。文中借助 Python 实现与模型交互,提供大量实操流程与代码示例。虽存在不足,但实操彰显其巨大潜力,为嵌入式工程师提供高效工作新思路与全面实操指南。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2001

完全自学C(干货) —— 字符(串)函数

字符(串)库函数!

NapoleonCoder的博客 407

【回答问题】ChatGPT上线了!如何安装python-ipopt?python-ipopt有哪些用法?

python-ipopt是一种基于Python语言的求解非线性最优化问题的软件包。它使用了Interior Point Optimizer(IPOPT)算法来求解最优化问题。这段代码使用python-ipopt求解了一个无约束的非线性最小化问题,其目标函数为(x[0] - 1) ** 2 + (x[1] - 2) ** 2,求解结果为x_opt。求解线性规划问题、二次规划问题、二次范数最小化问题等类型的最优化问题。对于给定的最优化问题,可以设置不同的求解参数来控制求解的精度和效率。

源代码杀手的博客 2144

完全自学C(干货) —— 内存操作函数

memcpy/memmove/memcmp/memset;

NapoleonCoder的博客 248

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

完全自学C(干货) —— C简介

C介绍

NapoleonCoder的博客 2343

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

完全自学C(干货) —— 编译与链接

编译与链接,预处理指令;

NapoleonCoder的博客 1203

完全自学C(干货) —— 指针进阶

字符指针; 数组指针/指针数组; 数组传参/指针传参; 函数指针/函数指针数组; 指向函数指针数组的指针; 回调函数

NapoleonCoder的博客 330

完全自学C(干货) —— 数组

一组相同类型元素的集合,可存储一系列相同类型的数据;

NapoleonCoder的博客 1153

完全自学C(干货) —— 常量、变量

常量:不能改变的量,在程序的运行过程中,不能变化的量; 变量:能被改变的量,在程序的运行过程中,可能会改变或者被赋值的量;

NapoleonCoder的博客 366

【方法分享】准大学生如何自学C语言?

准大学生如何自学C语言 文章目录准大学生如何自学C语言一、找寻一个优质教学视频二、使用优质编译器三、安排一个电子笔记需不需要一个ipad来辅助学习?结语 虽说现在已经接近我们最长的且无忧无虑的暑假的尾声 但我估摸着很多小伙伴还是和我一样整天摸鱼,不知不觉就浪费了一天 (其实只有我在摸鱼对吗,流下了不争气的泪水) 不扯这些没用的,进入今天的正题 本篇博客和大家分享一下我是如何自学C语言的,以及如何做学习笔记 学习方法各不相同,请以自身情况为准 一、找寻一个优质教学视频 好的教学资源永远是我们学习的第一步 在这

慕雪华年的博客 3178

完全自学C(干货) —— 预处理详解

预处理;

NapoleonCoder的博客 941

完全自学C(干货) —— 第一个C代码

编译器:Visual Studio 2019

NapoleonCoder的博客 519

完全自学C(干货) —— 结构体初识

是一些值的集合,这些值被称为成员变量;

NapoleonCoder的博客 344

完全自学C(干货) —— 文件

文件名/文件指针/文件的打开和关闭/文件的顺序读写/文件的随机读写/文本文件和二进制文件/文件的结束判定/文件缓冲区;

NapoleonCoder的博客 543

自学C语言的五大误区:为什么有人3个月放弃,有人却能成为高手?

C语言作为一门经典且强大的编程语言,在系统软件、嵌入式开发、游戏开发等众多领域都有着广泛的应用。许多人怀揣着对编程的热情踏上了自学C语言的道路,但结果却大相径庭:有的人在短短3个月内就选择放弃,而有的人则能逐渐成长为编程高手。造成这种差异的原因,很大程度上在于是否陷入了自学的误区。本文将为你揭示自学C语言的五大误区,帮助你避开陷阱,更高效地学习C语言。

星辰夜语的博客 1107

完全自学C(干货) —— 关键字

关键字;

NapoleonCoder的博客 311

完全自学C(干货) —— 动态内存管理

对事先不确定的内存大小可使用动态内存函数;

NapoleonCoder的博客 392
上一篇: 完全自学C(干货) —— 结构体初识
下一篇: 完全自学C(干货) —— 递归
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值