C语言中的函数(1)

本文详细介绍了C语言中函数的基础概念,包括库函数与自定义函数的区别,以及函数的语法形式、形参和实参、return语句的使用。还讨论了如何以一维和二维数组作为函数参数,并提供了相关示例。
摘要由CSDN通过智能技术生成

目录

函数的概念

库函数

自定义函数

函数的语法形式

举例

形参和实参

return语句

数组做函数参数

一维数组做参数

二维数组做参数


函数的概念

      函数相信在数学上大家都不陌生,比如一元函数,二元函数。

那么在C语言中函数又是什么意思呢?我们一起来看看!

函数事实上是从英文function翻译过来的,从英文也可以看出来函数是用来实现一定的功能的,C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码,就相当于一个小的程序来实现所需要完成的功能,一个个小的程序组装在一起就可以实现总任务。⼀个⼤的计算任务可以分解成若⼲个较 ⼩的函数(对应较⼩的任务)完成。同时⼀个函数如果能完成某项特定任务的话,这个函数也是可以 复⽤的,提升了开发软件的效率

     在C语言中,从用户的角度来看,可以分为:

1.库函数

2.自定义函数

函数的形式来看,可以分为:

1.无参函数

2.有参函数

库函数

C语⾔的国际标准ANSI C规定了⼀些常⽤的函数的标准,被称为标准库,那不同的编译器⼚商根据ANSI提供的C语⾔标准就给出了⼀系列 函数的实现,这些函数就被称为库函数。像我们平时使用的printf,scanf都是库函数,在 库函数使用 的时候,我们 必须包含它们所对应的头文件 ,比如printf,scanf的头文件是stdio.h,除了这个头文件外,C语言还有许多的头文件。
这里给出两个学习网站:
C/C++官⽅的链接: https://zh.cppreference.com/w/c/header
cplusplus.com: https://legacy.cplusplus.com/reference/clibrary/

自定义函数

自定义函数就是程序员自己定义的函数,它可以用来解决程序员专门需要的函数,它给程序员写 代码更多的创造性。

函数的语法形式

函数的一般形式如下:

1 ret_type fun_name()

2{

3

4}

 ret_type 是函数返回类型是⽤来表⽰函数计算结果的类型,有时候返回类型可以是 void ,表⽰什么都不返回

  fun_name 是函数名 ,一般需要 有实际意义 ,便于与其他不同的函数进行区分。
  括号中放的是形式参数 ,形式参数可以 省略形参名,必须指定类型
  {}括起来的是函数体

举例

下面我们可以通过下面几个例子来更好地理解。

1.用函数来实现加法

//实现加法
#include<stdio.h>
int Add(int x, int y)//int为返回类型,这里需要返回一个整型,Add是函数名,(接收两个整型参数)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int a = 0;
	int b = 0;
	printf("请输入两个数:\n");
	scanf("%d %d", &a, &b);
	printf("和为:%d\n", Add(a, b));//函数的调用
	return 0;
}

2.用函数来实现输出最大值

#include<stdio.h>
int Max(int x, int y)
{
	return x > y ? x : y;//条件表达式
}
int main()
{
	int a = 0;
	int b = 0;
	printf("请输入两个数:\n");
	scanf("%d %d", &a, &b);
	printf("最大值为:%d\n", Max(a, b));
	return 0;
}

形参和实参

在前面我们提到了函数按函数的形式可以分为:

1.无参函数

2.有参函数

这里我们首先需要了解形参和实参

我们用下面的代码来更好的理解

#include<stdio.h>
int Max(int x, int y)
{
	return x > y ? x : y;//条件表达式
}
int main()
{
	int a = 0;
	int b = 0;
	printf("请输入两个数:\n");
	scanf("%d %d", &a, &b);
	printf("最大值为:%d\n", Max(a, b));
	return 0;
}

在这个代码中调⽤Max函数时,传递给函数的参数a和b,称为实际参数,简称实参。实际参数就是真实传递给函数的参数把a和b的值传递过去,进行相应的处理。

在定义函数的时候,在函数名 Max 后的括号中写的 x y ,称为形式参数,简 称形参。这里形参去接收实参的值进行函数体内部的处理,我们可以把它理解为是 实参的一份临时拷贝 。事实上,当我们 定义了一个 函数,但是不去调⽤的话, 形参只是形式上存在的 不会向内存申请空间 ,不会真实存在的(我们可以把它理解成一种假死的状态),所以叫形式参数。形式参数只有在 函数被调⽤的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是 形参的实例化。
我们可以通过监视来进行观察:
当进入Max函数时,a和b的值就传递给了x和y,但是他们的地址却是不一样的,所以我们 可以理解为形参是实参的⼀份临时拷⻉。

return语句

在前面我们也可以看到return语句可以带回函数的返回值到调用的地方,在使用时有几个注意事项:

1. return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则 先执⾏表达式,再返回表达式的结果 前面的Max函数中return后面就是一个条件表达式,先运行表达式,然后再返回最大值。
2. return后边也可以什么都没有, 直接写 return ; 这种写法适合函数返回类型是void的情况。
比如下面这个代码
#include<stdio.h>
void print()
{
	printf("************\n");
	return;
}
int main()
{
	print();//无参函数
	return 0;
}
当然这种情况下也可以直接不写return
3. return返回的值和函数返回类型不⼀致, 系统会⾃动将返回的值隐式转换为函数的返回类型
#include<stdio.h>
int Add(int x, int y)
{
	float z = x + y;
	return z;
}
int main()
{
	int a = 3;
	int b = 5;
	printf("%d\n", Add(a, b));
	return 0;
}

比如上面这个代码虽然return后面返回的是浮点数,但是系统会⾃动将返回的值隐式转换为整型。

4. return语句执⾏后,函数就彻底返回,后边的代码不再执⾏。 当有多个return语句时,执行了一个return语句后,后边的代码就不会再执⾏了。
#include<stdio.h>
void test()
{
	printf("Hello!\n");
	if (1)
		return;
	printf("YES!!!!\n");
}
int main()
{
	test();//函数调用
	return 0;
}

这个代码只打印了Hello!遇到了return,后边的代码不再执⾏,这个适用于想提前返回的情况。

当第一个条件满足,就直接返回,后面的就不会继续执行。

5. 如果函数中 存在if等分⽀ 的语句,则要 保证每种情况下都有return返回 ,否则会出现编译错误。
上面这个代码当a!=0(为真)才会有返回值,所以编译器就会出现警告!
6.return语句 只可以返回一个值,不可以返回多个值。
7. 当函数没有指定返回类型时,编译器默认返回int类型的值。
如果函数要求有返回值,但是没有使用return语句,那么具体的返回值就不确定了。

数组做函数参数

在一些情况下,我们需要处理多个数据,这个时候我们可以使用数组来进行传参处理多个数据。

首先,我们需要知道以下这些注意事项:

1. 函数的形式参数要和函数的实参 个数匹配
2. 函数的实参是数组名,形参写成数组形式
3. 形参如果是 ⼀维数组 数组⼤⼩可以省略不写
4. 形参如果是 ⼆维数组 ⾏可以省略,但是列不能省略
5. 数组传参,形参是不会创建新的数组的
6. 形参操作的数组和实参的数组是 同⼀个数组,因为传的是数组首元素地址,当形参数组各元素值发生变化时,实参数组的值也会同步发生变化。
7.形参和实参的 数组名可以一样,也可以不一样

一维数组做参数

例子: 写⼀个函数将⼀个整型数组的内容,全部置为-1,再写⼀个函数打印数组的内容。
//写⼀个函数将⼀个整型数组的内容,全部置为-1,再写⼀个函数打印数组的内容。
#include<stdio.h>
void set_arr(int arr[], int sz,int set)
{
	int i = 0;
	for (i = 0; i < sz; i++)
		arr[i] = set;
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
		printf("%d ", arr[i]);
	printf("\n");
}
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);
	set_arr(arr, sz, -1);
	print_arr(arr, sz);//可以多次调用
	return 0;
}

二维数组做参数

例子:有一个3*5的二维数组,求数组元素中的最大值

//有一个3*5的二维数组,求元素的最大值
#include<stdio.h>
void print_arr(int arr[3][5], int r, int c)
{
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
			printf("%3d", arr[i][j]);
		printf("\n");
	}
}
int Max(int arr[][5], int r, int c)//二维数组传参可以省略行,不可以省略列
{
	int max = arr[0][0];
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			if (arr[i][j] > max)
				max = arr[i][j];
		}
	}
	return max;
}
int main()
{
	int arr[3][5] = { {1,2,3,4,5},{12,23,45,19,34},{6,7,9,8,10} };
	print_arr(arr, 3, 5);//打印二维数组
	int ret = Max(arr, 3, 5);//返回值存放到ret中
	printf("最大值为:%d\n", ret);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值