C语言函数详解(1)

news2024/12/23 19:13:05

目录

函数是什么

 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;
	}
	else
		return 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.coloradmin.cn/o/857573.html

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

相关文章

【链表OJ 2】反转链表

前言: &#x1f388;欢迎大家来到Dream_Chaser&#xff5e;的博客&#x1f388; &#x1f6a9;本文收录于 C--数据结构刷题的专栏中 -->http://t.csdn.cn/n6UEP 首先欢迎大家的来访&#xff0c;其次如有错误&#xff0c;非常欢迎大家的指正,互相学习进步。 一.反转链表 来…

【高危】 Microsoft Exchange Server 远程代码执行漏洞

漏洞描述 Microsoft Exchange Server 是微软公司开发的一款邮件服务器。 Microsoft Exchange Server 受影响版本中&#xff0c;具有普通用户权限&#xff08;Exchange 用户凭据&#xff09;的攻击者可能在同一内网环境中攻击Exchange服务&#xff0c;远程执行任意代码。 由于…

【学习】若依源码(前后端分离版)之 “ 上传图片功能实现”

大型纪录片&#xff1a;学习若依源码&#xff08;前后端分离版&#xff09;之 “ 上传图片功能实现” 前言前端部分后端部分结语 前言 图片上传也基本是一个项目的必备功能了&#xff0c;所以今天和大家分享一下我最近在使用若依前后端分离版本时&#xff0c;如何实现图片上传…

Oracle到DM实时数据同步实施方案

目录 1 项目概述 2 需求分析 3 实施操作 3.1 历史数据全量同步 3.2 增量数据实时同步 4 问题总结 4.1 字符型非空约束 4.2 字符型唯一索引尾部空格 1 项目概述 将Oracle 11g RAC生产环境数据同步到DM8分析环境&#xff0c;Oracle数据库大小1.5T&#xff0c;日增归档10…

Windows和Linux系统上的矢量运算:指令级并行计算SIMD(SSE/AVX)应用细节以及相关跨平台的源码解释

注&#xff1a;本文的SIMD&#xff0c;指的是CPU(base intel x86 architecture)指令架构中的相关概念。不涉及GPU端的算力机制。下面的代码在Win10和Linux上均可用。 基本概念 SSE: Streaming SIMD Extensions, x86 architecture AVX: Advanced Vector Extensions SIMD&#…

vue项目中Uncaught runtime errors:怎样关闭

原文链接&#xff1a; yvue项目中Uncaught runtime errors:怎样关闭_笑毅的博客-CSDN博客https://blog.csdn.net/qq_36877078/article/details/131175355是webpack-dev-server弄出来的 解决办法 在vue.config.js中添加如下配置 module.exports defineConfig({...devServer:…

GDB 打印uint64位数据值

今天一来组长就让我查一个问题&#xff0c;说是我们的接口返回的数据需要赋值为-1&#xff0c;返回给上层调用。结果我一看代码&#xff0c;代码里就是写死了赋值 -1 的&#xff0c;但他说实际返回的好像不是 -1&#xff0c;所以只能让我gdb 跟踪一下了。本来想用 window 下的计…

[Linux]进程间通信(上篇)——匿名管道(管道原理,实现示例,端口情况探究!!)

hello&#xff0c;大家好&#xff0c;本篇文章介绍Linux进程间的通信&#xff0c;包含内容有进程间通信的介绍、理解&#xff0c;管道的介绍使用&#xff1a;匿名管道&#xff0c;匿名管道的实现示例&#xff0c;匿名管道端口4种情况的探究。 目录 1️⃣进程间通信 &#x1f…

ruby send call 的简单使用

refer: ruby on rails - What does .call do? - Stack Overflow Ruby使用call 可以调用方法或者proc m 12.method("") # > method gets the method defined in the Fixnum instance # m.class # > Methodm.call(3) #> 15 # 3 is passed inside the…

项目管理:四步帮你轻松制定计划

当项目经理接手一个项目的时候&#xff0c;做一个项目的日程安排是必须的&#xff0c;因为这是决定项目是否成功完成的最重要任务之一。 项目经理制定项目计划的步骤&#xff1a; 1、确定目标 项目目标极为关键&#xff0c;只有目标想清楚了&#xff0c;才可能正常开展后期…

选择CRM系统时需要有哪些功能?

企业在选型时&#xff0c;众多的CRM品牌是否让您挑花了眼&#xff1f;CRM客户管理系统哪个好用&#xff1f; 1、功能强大 Zoho CRM提供了从销售、市场营销、客服到项目管理、人力资源、财务等全方位的CRM功能&#xff0c;可以满足不同行业和规模的企业的需求。可以提供销售自…

Python(七十四)集合的数学操作

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

产品管理经验分享:删掉 500 个产品待办事项后,我逃离了「假敏捷」

文章开始之前&#xff0c;我想先请大家思考几个问题&#xff1a; 你的产品待办列表中有多少项工作&#xff1f;其中最早的待办事项是什么时候创建的&#xff1f;你和 Scrum 团队多久会维护一次列表中那些从没进过迭代的「钉子户」事项&#xff1f; 我第一次问自己时&#xff0…

esp8266使用arduinoJson与tft_espi库发生冲突解决方法

esp8266使用arduinoJson与tft_espi库发生冲突解决方法 arduinoJson与tft_espi库发生冲突解决方法下载arduinoJson5.0版本的&#xff0c;不要用最新版本 示范代码&#xff1a; // Copyright Benoit Blanchon 2014 // MIT License // // Arduino JSON library // https://git…

AIGC创世计划设计视频课程

课程介绍 AIGC创世计划设计视频课程是一门专注于创意设计的课程。通过视频教学&#xff0c;学习者将了解到关于创意设计的理论知识和实践技巧&#xff0c;并能够运用这些知识和技巧进行创作。本课程涵盖了多个设计领域&#xff0c;包括平面设计、产品设计、UI/UX设计等。无论是…

C++,文本文件,写文件操作

代码演示&#xff1a; #include <iostream> using namespace std;//1、包含头文件 #include<fstream>void test() {//2、创建流对象ofstream ofs;//3、打开文件(默认源文件路径&#xff09;ofs.open("test.txt", ios::out);//4、写数据ofs << &qu…

Leetcode每日一题:1289. 下降路径最小和 II(2023.8.10 C++)

目录 1289. 下降路径最小和 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 动态规划 原理思路&#xff1a; 1289. 下降路径最小和 II 题目描述&#xff1a; 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路…

【Linux取经路】基础开发工具——gdb篇

文章目录 一、背景知识介绍二、gdb常用指令 一、背景知识介绍 程序的发布方式有两种&#xff0c;Debug模式和release模式。Debug是开发者模式&#xff0c;而用户最终使用的是release。Debug模式下的代码&#xff0c;可以被追踪、调试&#xff0c;因为在Debug模式下形成的可执行…

浪潮数字咨询专家孙崇虎受邀为第十二届中国PMO大会演讲嘉宾

浪潮数字企业技术有限公司集团管控事业部咨询专家孙崇虎先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;VUCA时代的项目管理信息化应对。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 当前…

LiveNVR监控流媒体Onvif/RTSP功能-如何配置默认用户账户及用户密码修改用户名

LiveNVR监控摄像头如何配置默认用户账户及用户密码修改用户名 1、默认用户名密码1.1、初次配置启动1.2、重新配置启动 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、默认用户名密码 1.1、初次配置启动 在解压目录下的 livenvr.ini 里面添加如下配置&#xff0c;配置后再启动&a…