C语言函数详解(1)

目录

函数是什么

 C语言中函数的分类

 库函数

自定义函数

函数的参数

实际参数(实参)

形式参数(形参)

函数的调用

传值调用

传址调用

练习

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

嵌套调用 

链式访问


函数是什么

数学中我们常见到函数的概念。但是你了解C语言中的函数吗?
维基百科中对函数的定义:子程序

在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,
subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组
成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

 C语言中函数的分类

1.库函数

2.自定义函数

 库函数

这里有一个查看库函数的网站:http://www.cplusplus.com
为什么会有库函数?像printf,strcpy,pow这些都是库函数,这些库函数完成了一些基础功能,我们在开发的过程中每个程序员都可能用的到,增强了程序的可移植性和提高程序的效率。

 简单的总结,C语言常用的库函数都有::

IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数

补充:大家可能会这样想,库函数是不是C语言提供的呢?其实不然!C语言标准只是规定了函数的功能、函数名、函数的参数以及返回类型,但是函数的具体实现是由编译器厂商提供的,也就是说,不同的编译器厂商对一同一个函数的实现代码可能有所不同(比如微软和苹果这两家厂商提供的编译器在实现strlen时,函数的功能完全一样,但是函数内部实现代码会有所不同,因为这是不同的程序员写的)

接下来,我们查阅文档来学习一下memset函数。

 从上图中,我们大概了解到,memset的函数功能大概是将ptr指向的前num的字节替换成value,需要包含string.h头文件

我们简单使用一下这个函数:

 就会发现,这个函数原来是这个样子呀~

注:库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。

自定义函数

如果库函数能干所有的事情,那还要程序员干什么?
所有更加重要的是自定义函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。

 函数的组成:

ret_type  fun_name(para1, *)

{

        statement;//语句项

}

ret_type     返回类型

fun_name  函数名

para1         函数参数

下面我们看一个例子:

写一个函数可以找出两个整数中的最大值。 

#include <stdio.h>
int get_max(int x, int y)
{return x > y ? x : y;
}
int main()
{int num1 = 10;int num2 = 20;int max = get_max(num1, num2);printf("%d\n",max);return 0;
}

函数的参数

实际参数(实参)

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

形式参数(形参)

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

可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝

函数的调用

传值调用

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

传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

练习

1. 写一个函数可以判断一个数是不是素数

#include <stdbool.h>
#include <stdio.h>
#include <math.h>
bool is_prime(int n)
{int j = 0;for (j = 2; j <= sqrt(n); j++){if (n % j == 0){return false;}}return true;
}
int main()
{int i = 0;int count = 0;for (i = 101; i <= 200; i += 2){if (is_prime(i)){printf("%d ", i);;count++;}}printf("\ncount=%d\n", count);return 0;
}

2.写一个函数判断一年是不是闰年。

#include <stdbool.h>
bool is_leap_year(int y)
{if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)){return 1;}elsereturn 0;
}
int main()
{int y = 0;int count = 0;for (y = 1000; y <= 2000; y++){if (is_leap_year(y)){printf("%d ",y);count++;}}printf("\n%d\n", count);return 0;
}

3.写一个函数,实现一个整形有序数组的二分查找。

//找到了,就返回下标
//没找到,返回-1
int binary_search(int arr[], int k, int sz)
{int left = 0;int right = sz - 1;while (left<=right){//这种求平均的方法可能会溢出//int mid = (left + right) / 2;//这种方法求中间值比较好int mid = left + (right - left) / 2;if (arr[mid] < k){left = mid + 1;}else if (arr[mid] > k){right = mid - 1;}else{return mid;}}return -1;
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;scanf("%d",&k);int sz = sizeof(arr) / sizeof(arr[0]);int n = binary_search(arr, k, sz);if (n == -1){printf("没找到\n");}else{printf("%d\n",n);}return 0;
}

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

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

嵌套调用 

#include <stdio.h>
void new_line()
{printf("hehe\n");
}
void three_line()
{int i = 0;for (i = 0; i < 3; i++){new_line();}
}
int main()
{three_line();return 0;
}

函数可以嵌套调用,但是不能嵌套定义。

链式访问

#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = {0};//abc\0.....char arr2[] = "abc";printf("%d\n", strlen(strcpy(arr1, arr2)));//链式访问return 0;
}

看一组有意思的代码:

#include <stdio.h>
int main()
{printf("%d", printf("%d", printf("%d", 43)));//注:printf函数的返回值是打印在屏幕上字符的个数return 0;
}

4321

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

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

相关文章

node笔记——调用免费qq的smtp发送html格式邮箱

文章目录 ⭐前言⭐smtp授权码获取⭐nodemailer⭐postman验证接口⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于node调用免费qq的smtp发送邮箱。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node node_nvm安装配置 node笔记_h…

从零实现深度学习框架——Transformer从菜鸟到高手(一)

引言 &#x1f4a1;本文为&#x1f517;[从零实现深度学习框架]系列文章内部限免文章&#xff0c;更多限免文章见 &#x1f517;专栏目录。 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;系列文章会基于纯Python和NumPy从零创建自己的类PyTorch深度学习框…

js 正则表达式

js 正则表达式 http://tool.oschina.net/regex https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions 11 22 333

磁盘的管理

一、磁盘的分区 查看磁盘 lsblk fdisk -l 2、分区 没有e扩展&#xff0c;则都是主分区&#xff0c;已经有三个主分区了&#xff0c;剩下的全设置为扩展 查看分区结果&#xff1a; 二、格式化 三、挂载

JVM、JRE、JDK三者之间的关系

JVM、JRE和JDK是与Java开发和运行相关的三个重要概念。 再了解三者之前让我们先来了解下java源文件的执行顺序&#xff1a; 使用编辑器或IDE(集成开发环境)编写Java源文件.即demo.java程序必须编译为字节码文件&#xff0c;javac(Java编译器)编译源文件为demo.class文件.类文…

Web-WebApp Vue.js 目录结构

WebApp Vue.js 目录结构 目录解析 目录/文件 说明 build 最终发布的代码存放位置。config 配置目录&#xff0c;包括端口号等。我们初学可以使用默认的。node_modules npm 加载的项目依赖模块 src 这里是我们要开发的目录&#xff0c;基本上要做的事情都在这个目录里。里面包…

Pycharm如何打断点进行调试?

断点调试&#xff0c;是编写程序中一个很重要的步骤&#xff0c;有些简单的程序使用print语句就可看出问题&#xff0c;而比较复杂的程序&#xff0c;函数和变量较多的情况下&#xff0c;这时候就需要打断点了&#xff0c;更容易定位问题。 一、添加断点 在代码的行标前面&…

ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, CVE-2017-5754)

ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, CVE-2017-5754) 二、Variant 1 (CVE-2017-5753) 三、Variant 2 (CVE-2017-5715) 四、Variant 3 (CVE-2017-5754) 一、ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, C…

15-矩阵转置的拓展延伸

&#x1f52e;矩阵的转置✨ 前言 在很多时候我们拿到的数据本身可能并不会把点的坐标按列的方向排列起来&#xff0c;对于我们人类来说&#xff0c;更方便的方式依然是把这个点的坐标按行的方向排列&#xff0c;我们比较熟悉把矩阵看作为一个数据&#xff0c;在这里&#xff0…

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)

文章目录 1. 主要的窗体类及其用途2. 窗体类重要特性的设置2.1 setAttribute()函数2.2 setWindowFlags()函数2.3 setWindowState()函数2.4 setWindowModality()函数2.5 setWindowOpacity()函数 3. 多窗口应用程序设计3.1 主窗口设计3.2 QFormDoc类的设计3.3 QFormDoc类的使用3.…

某科技公司提前批测试岗

文章目录 题目 今天给大家带来一家提前批测试岗的真题&#xff0c;目前已经发offer 题目 1.自我介绍 2.登录页面测试用例设计 3.如何模拟多用户登录 可以使用Jmeter,loadRunner性能测试工具来模拟大量用户登录操作去观察一些参数变化 4.有使用过Jmeter,loadRunner做过性能压…

数据库运维是什么意思?主要工作包含哪些?

还有不少小伙伴不知道数据库运维是什么意思&#xff1f;主要工作内容包含哪些&#xff1f;今天我们就一起来简单了解一下吧&#xff0c;仅供参考哦&#xff01; 数据库运维是什么意思&#xff1f; 数据库运维是指对数据库系统进行管理、监控和维护的过程&#xff0c;以确保数据…

ABPVNEXT-微服务框架基础入门

准备工作&#xff1a; 1.登录ABPvNext官网 网址 http://abp.io 2.跳转到商业版的说明文档&#xff0c;目前商业版没有中文&#xff0c;只能使用谷歌浏览器的内置翻译功能了 3.框架的相关环境要求&#xff0c;请自自行查看 适用于 Windows 的Visual Studio 2022 (v17.3) /…

适配器模式

泰国旅游使用插座问题 泰国插座用的是两孔的&#xff08;欧标&#xff09;&#xff0c;可以买个 多功能转换插头&#xff08;适配器&#xff09;&#xff0c;这样就可以使用了 适配器模式基本介绍 适配器模式&#xff08;Adapter Pattern&#xff09;将某个类的接口转换成客户端…

【M波段2D双树(希尔伯特)小波多分量图像去噪】基于定向M波段双树(希尔伯特)小波对多分量/彩色图像进行降噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

修改el-select样式;修改element-plus的下拉框el-select样式

修改el-select样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更改:deep .el-input__wrapper {height: 42px;background-color: rgba(0,0,0,0)!important;box-shadow: 0 0 0 …

PHP实现在线进制转换器,10进制,2、4、8、16、32进制转换

1.接口文档 2.laravel实现代码 /*** 进制转换计算器* return \Illuminate\Http\JsonResponse*/public function binaryConvertCal(){$ten $this->request(ten);$two $this->request(two);$four $this->request(four);$eight $this->request(eight);$sixteen …

状态模式(C++)

定义 允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。 应用场景 在软件构建过程中&#xff0c;某些对象的状态如果改变&#xff0c;其行为也会随之&#xff0c;而发生变化&#xff0c;比如文档处于只读状态&#xff0c;其支持的行为和读写…

希尔排序——C语言andPython

前言 步骤 代码 C语言 Python 总结 前言 希尔排序&#xff08;Shell Sort&#xff09;是一种改进的插入排序算法&#xff0c;它通过将数组分成多个子序列进行排序&#xff0c;逐步减小子序列的长度&#xff0c;最终完成整个数组的排序。希尔排序的核心思想是通过排序较远距…