【C语言】函数(一)

目录

  • 函数介绍
  • 函数分类
    • 库函数
    • 自定义函数
  • 函数参数
    • 实际参数
    • 形式参数

函数介绍

函数大家应该都不陌生,在中学甚至小学的时候数学当中都有函数这个概念。比如y=x+1,但是在C语言中或者说编程语言中,函数是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。

函数分类

在C语言中函数有两类分别是库函数和自定义函数。

库函数

为什么会有库函数?
我们一般在编写程序的时候一定会实现一切基础功能,这样的功能可能需要频繁实现。它不是业务性的代码,每个程序员在开发的过程中都可能会用得到,为了支持可移植性,提高程序的效率,C语言将常用的功能封装成一个一个函数,从而提供了一系列的库函数,方便开发。比如计算m的n次方,在数学库中提供了pow这样的函数。
不过C语言并不是直接实现库函数,而是提供了C语言的标准和库函数的约定。比如在编写程序的时候使用了scanf函数,C语言并没有实现输入的功能,而是在编译的时候编译到了scanf函数,编译器知道后从而实现输入,所以说库函数一般是由编译器去实现的。
既然都有“库”,里面肯定会有很多个函数,我怎么知道哪些函数有什么功能,可以使用前面文章说过的cplusplus网站去学习这个库函数。

示例: strcpy库函数,实现字符串的复制。我们不知道它怎么使用,去cplusplus网站查询。

【C语言】函数(一)_第1张图片
【C语言】函数(一)_第2张图片

我们自己再来写一个:

//strcpy库函数的使用
#include
#include //包含strcpy函数
int main()
{
	char arr1[] = "hello world!"; //源头数组
	char arr2[20] = { 0 }; //目标数组
	strcpy(arr2, arr1);//将arr1中的内容复制到arr2中
	printf("%s", arr2);//打印arr2
	return 0;
}

前面说过cplusplus网站,现在来介绍另一个网站:cppreference,它是C/C++的官方文档。有中文版和英文版。我这里贴的是中文版的链接。

自定义函数

比起库函数,自定义函数更加重要,更能体现一名程序员的水平。自定义函数和库函数一样,都有函数名,返回值类型和函数参数。但是与库函数不一样的是这些都是开发者自己设计,有很大的发挥空间。

比如我们求两个整数中的最大值,直接在主函数中写:

//求两个数中的最大值
#include
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	int max = (a > b ? a : b);
	//C语言中唯一的三目操作符
	printf("%d", max);

	return 0;
}

用函数来实现:

//求两个数中的最大值
#include

int get_max(int x, int y)
{
	int z = (x > y ? x : y);
	return z;
}
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	int max = get_max(a, b);
	printf("%d", max);

	return 0;
}

函数参数

我们先使用一个函数来实现两个整数的交换,按我们正常思路应该是这么写:

#include

void Swap(int x, int y)
{
	int tmp = 0;
	tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	Swap(a, b);
	printf("%d %d", a, b);

	return 0;
}

但是运行后,你会发现程序是成功编译了,但是没有成功将两个数交换过来。这是为什么呢?

实际参数

真实传给函数的参数,叫实际参数,简称实参。
实参可以是常量、变量、表达式、函数等。
在进行函数调用时,实参都必须有确定的值,以便把这些值传送给形参。

形式参数

形式参数是指函数名后括号中的变量,简称形参。因为形参只有在函数被调用的过程中才实例化或者说分配内存,也就是说在没调用函数前,函数里面的int a等等不占用内存,就跟有一些活动一样,没有真正举办,就是走个形式,所以叫形式参数。形式参数在函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

在前面代码Swap函数中的x和y就是形式参数,在主函数中的a和b就是实际参数。了解形参和实参后,回过头来看前面那段代码,我们在VS中进行逐语句调试发现调用Swap函数后只有x和y的值变了,a和b的值并没有交换,这是因为形参实例化是实参的临时拷贝,也就是说在调用Swap函数的时候,x和y有了自己的内存空间,同时有着和实参完全相同的内容,可以理解为实参传递给形参的时候形参没要,只是复制了一份实参的内容自己另起灶炉重新开辟一块内存空间。空间都不同了,那么形参的改变自然不会影响到实参,所以x和y的值交换了,但是a和b的值并没有交换。

这样想,刘某在网上看房,看了李某的房子觉得很好但是没买李某的房子,刘某重新买了一套房子,和李某的房子户型装修等等全都一样,这个时候刘某随便改变他的房子都不会影响到李某。那我想要改变李某的房子应该怎么办,首先需要知道李某房子的地址,然后顺着地址找到李某的房子买下它住进去,然后改变房子的一些东西。

想要交换a和b的值,需要将a和b的地址传给形参,通过地址找到a和b,然后交换二者的值。想要对地址进行操作就需要使用让C语言出名的指针了。所以正确的代码是这个样子:

#include

void Swap(int *x, int *y)
{
	int tmp = 0;
	tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	Swap(&a, &b); //注意取地址
	printf("%d %d", a, b);

	return 0;
}

你可能感兴趣的:(C语言,c语言,开发语言)