函数
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)
{

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

被折叠的 条评论
为什么被折叠?



