【C语言初阶】函数与函数分类
文章目录
一、函数是什么
函数是能够实现特定功能的语句块。(函数是C程序中的基本模块)
-
函数负责完成某项特定的功能,相较于其他代码具有相对的独立性。
-
一般会有输入的参数和返回值,同时将实现的细节和过程封装隐藏起来。
作用:将一些实现特定功能的代码封装起来,实现成函数,提高了开发效率,实现了代码的复用。
二、函数分类
函数分类:
- 库函数
- 自定义函数
1 库函数
为了支持程序的可移植性和提高程序效率,C语言的基础库中提供了一系列的库函数,方便进行软件开发。
C语言中常用的库函数有:
- I/O函数 ( scanf()、printf()、getchar()、putchar() )
- 字符串操作函数 ( strlen()、strcmp() )
- 字符操作函数 ( islower()、isupper() )
- 内存操作函数 ( memset()、memcmp() )
- 时间/日期函数 ( time() )
- 数学函数 ( sqrt()、pow() )
- 其他库函数
库函数学习:cplusplus.com
1.1 库函数举例学习
1.1.1 strcpy()
字符串拷贝函数 -
strcpy()
① 函数原型
char * strcpy ( char * destination, const char * source );
② 作用:复制字符串
将源字符串
source
指向的字符串复制到目标destination
指向的数组中,包括终止的null
字符(并在该点停止)。
为避免溢出,目标 destination
指向的数组的大小应足够长,用以包含与源字符串 source
相同的字符串(包括终止空字符 \0
)。
③ 函数参数
destination
:
指向要在其中复制内容的目标数组的指针。
source
:
要复制的字符串。
④ 返回值
返回 destination
,即目的字符串的起始地址。
⑤ 库函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
//strcpy()的使用
char arr1[] = "hello pokemon";
char arr2[20] = { 0 };
//对于数组,数组名就是首元素的地址,即起始地址
strcpy(arr2, arr1);
printf("%s\n", arr2);//hello pokemon
return 0;
}
1.1.2 memset()
设置内存块的内容 -
memset()
① 函数原型
void * memset ( void * ptr, int value, size_t num );
② 作用:填充内存块
将
ptr
指向的内存块的前num
个字节设置为指定值value
。
③ 函数参数
ptr
:
指向要填充的内存块的指针。
value
:
要设置的目标值。
num
:
要设置为 value
值的字节数。size_t
是无符号整数 unsigned int
类型。
④ 返回值
返回 PTR
,即被填充的内存块的起始地址。
⑤ 库函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
//memset()的使用
char arr[] = "hello pokemon";
memset(arr, 'X', 5);
printf("%s\n", arr);//XXXXX pokemon
return 0;
}
1.2 库函数查询工具
-
MSDN(Microsoft Developer Network)
-
cppreference.com (英文版)
-
cppreference.com (中文版)
1.3 注意事项
使用库函数,必须包含 #include
对应的头文件。
可以通过模拟实现库函数,真正掌握库函数的实现机制和使用方法。
2 自定义函数
自定义函数和库函数一样,都有函数名、函数参数和返回值类型。
但是自定义函数需要程序员自己设计,并编写代码实现。
2.1 函数的组成
ret_type func_name(parameter list)//函数头部
{
statement;//函数体
}
ret_type //返回值类型
func_name //函数名
parameter list //形参列表
statement //函数体语句
//函数体从左花括号 { 开始,到右花括号 } 结束
2.2 示例
2.2.1 示例1
函数实现,找出两个整数中的最大值。
代码示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int get_max(int x, int y)
{
//方法一
/*if (x > y)
return x;
else
return y;*/
//方法二
return x > y ? x : y;//使用条件运算符
}
int main()
{
//函数实现,找出两个整数中的最大值
int num1 = 0;
int num2 = 0;
//输入
printf("请输入两个整数:>");
scanf("%d %d", &num1, &num2);
//比较
int max = get_max(num1, num2);
//输出
printf("max = %d\n", max);
return 0;
}
解释说明:
1 get_max(num1, num2)
:调用函数 get_max()
,同时传入了两个实际参数 num1
和 num2
。
2 函数调用后,程序流会跳转到被调函数处,主调函数的执行暂时中断;调用结束后,会回到被调函数调用处,继续执行程序流。
2.2.2 示例2
函数实现,交换两个整型变量的值。
代码示例:
#include<stdio.h>
void swap1(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
void swap2(int* px, int* py)
{
int temp = *px;
*px = *py;
*py = temp;
}
int main()
{
//函数实现,交换两个整型变量的值。
int num1 = 5;
int num2 = 10;
printf("交换前:> num1 = %d, num2 = %d\n", num1, num2);//5 10
//交换
swap1(num1, num2);
printf("swap1:> num1 = %d, num2 = %d\n", num1, num2);//5 10
swap2(&num1, &num2);
printf("swap2:> num1 = %d, num2 = %d\n", num1, num2);//10 5
return 0;
}
解释说明:
1 swap1
函数传递的是变量的值,不能实现两个数的交换。
形参 x、y
只是实参 num1、num2
的一份临时拷贝,只是复制了实参的值,形参的改变不会影响实参。
2 swap2
函数传递的是变量的地址,可以使用指针变量,通过解引用可以找到实参,即可以对实参做出修改。
*px
相当于 num1
,*py
相当于 num2
;在这里,前者相当于后者的别名。
px = &num1; py = &num2;
*px = num1; *py = num2;
3 swap2
函数的传址调用可以理解为:把使用指针将两个变量的值进行交换的代码封装成了一个函数。
总结:
本节介绍了什么是函数以及函数的分类;给出了库函数的学习技巧和使用方法;同时也讲解了如何自定义函数。
感谢您的阅读!如有任何错误,欢迎您的批评指正!