函数--详

本文详细介绍了C/C++中的函数,包括函数的作用、分类、库函数与自定义函数的使用,以及函数的声明、定义、调用和递归。讲解了函数参数的传值与传址,通过示例阐述了函数的嵌套调用和链式访问,并讨论了函数设计的原则,如局部变量的使用和高内聚低耦合。此外,还提供了多个编程练习,如判断素数、闰年、二分查找等,加深对函数理解和应用。

函数

1.大型程序中某部分代码,负责完成某项特定任务,相较于其他代码,具有相对独立性·;
2.一般有输入参数,并有返回值,提供对过程的封装和对细节进行隐藏。这些代码通常被称为软件库;

函数的分类:

1.库函数

可移植性、提高程序效率

学习网站:https://cplusplus.com/doc/tutorial/functions/

C语言常用的库函数分类:

1.IO函数
2.字符串操作函数
3.字符操作函数
4.内存操作函数
5.时间/日期操作函数
6.数学函数
7.其他库函数

memory–记忆–内存(计算机中)

memset:内存设置函数

//void * memset(void * ptr,int value,size_t num)

//意思是将 ptr 指向的对象的前num个值 替换为 value

代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
   
   
	char arr1[20] = {
   
    0 };
	char arr2[] = "hello caiyun!";

	strcpy(arr1, arr2);

	memset(arr1, '*', 3);

	printf("%s\n", arr1);
}

2.自定义函数

自定义函数与库函数一样有函数名、返回值类型和函数参数,只不过要自己设计;

函数的组成:

ret_type fun_name(paral,*)
{
   
   
	statement;  //语句项
}
ret_type 返回类型
fun_name 函数名
paral    函数参数

1.找出两个数最大值:
找一个中间变量,将较大的数返回给中间变量并返回;

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int get_max(int x, int y)
{
   
   
	if (x > y)
	{
   
   
		printf("较大值是:%d",x);
	}
	else
		printf("较大值是:%d", y);
	return 0;
}
	int a = 0;
	int b = 0;
	printf("输入两个数:");
	scanf("%d %d", &a, &b);
	get_max(a, b);
	return 0;

2.交换两个数的内容
设置一个中间变量,将x的值赋给中间变量,然后将y的值赋给x,将中间变量的值赋给y,实现交换;

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void exchange(int x, int y)
{
   
   
	int z = 0;   //中间参数
	z = x;
	x = y;
	y = z;   
	printf("交换后的数值为:a=%d,b=%d\n", x, y);
}
int main()
{
   
   
	int a = 0;
	int b = 0;
	printf("输入两个数:");
	scanf("%d %d", &a, &b);
	printf("交换前两个数:a=%d,b=%d\n",a,b);
	exchange(a, b);
}

补充:如果代码这样写:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void exchange_error(int x, int y)
{
   
   
	int z = 0;   //中间参数
	z = x;
	x = y;
	y = z;
}
int main()
{
   
   
	int a = 0;
	int b = 0;
	printf("输入两个数:");
	scanf("%d %d", &a, &b);
	printf("交换前两个数:a=%d,b=%d\n", a, b);
	
	exchange_error(a, b);

	printf("交换前两个数:a=%d,b=%d\n", a, b);
	return 0;
}

在这里插入图片描述
原因:

在主程序中,系统分别给a,b分配空间,然后存储数值,

当调用交换函数时,系统会再给形参分配空间,与实参的地址不同,

在调用函数过程中,形参地址中的数值发生变化,但是主函数中,实参地址中的数值未发生未变化;

解决方案:在调用函数的过程中,将实参的地址传递给形参,对地址中的数据进行操作;

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void exchange_correct(int* pa, int* pb)
{
   
   
	int z = 0;   //中间参数
	z = *pa;
	*pa = *pb;
	*pb = z;  //已经对地址中的数据进行修改了
}
int main()
{
   
   
	int a = 0;
	int b = 0;
	printf("输入两个数:");
	scanf("%d %d", &a, &b);



	printf("交换前两个数:a=%d,b=%d\n", a, b);
	
	exchange_correct(&a, &b);

	printf("交换前两个数:a=%d,b=%d\n", a, b);
	return 0;
}

函数实参:实际参数,真实传递给函数的参数,可以是常量、变量、表达式、函数等,但是在函数调用时,必须是确定的值,以便将实参传送给形参;

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

形参是实参的一份临时拷贝;改变形参,不会改变实参;

函数的调用
1.传值调用:函数的形参与实参分别占用不同的内存块,对形参的修改不会影响实参;
2.传址调用:把函数外部创建变量的地址传递给函数参数的一种调用的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,达到了函数内部可以直接操作函数外部的变量;

小练习:编写函数实现一个功能
1.判断一个数是不是素数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>
judge_prime(int x)
{
   
   
	for (int j = 2; j < x; j++) //引用math.h
	{
   
   
		if (x % j == 0)
		{
   
   
			printf("%d 不是素数\n", x);
			break;
		}
		else if(j=x)
		{
   
   
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hskwcy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值