【C语言极简自学笔记】深入理解 C 语言中的函数:从基础到进阶

          在 C 语言的世界里,函数是构建程序的基本模块,它如同一个个精密的零件,支撑起整个程序的架构。掌握函数的概念和使用方法,是精通 C 语言编程的关键一步。本文将从函数的基础概念出发,逐步深入探讨其各个方面的知识。

一、函数的基本概念​

        函数是一组一起执行一个任务的语句,在 C 程序中,函数是程序的基本模块,它实现了模块化设计,使得代码更易于理解、维护和复用。C 程序总是从main()函数开始执行,其他函数通过main()函数调用执行。​

1.函数的优点​

(1)代码复用:编写一次函数后,可以在多个地方调用,避免重复编写相同的代码,提高开发效率。例如,我们编写一个计算两数之和的函数,在需要进行加法运算的地方都可以调用它。​

(2)模块化设计:将复杂的程序分解为多个功能独立的函数,每个函数专注于完成一个特定的任务,使程序结构清晰,易于理解和调试。比如,一个学生信息管理系统可以分为录入学生信息、查询学生信息、修改学生信息等多个函数。​

(3)可维护性:当需要修改某个功能时,只需修改对应的函数,而不会影响到其他部分的代码,降低了维护成本。

二、函数的定义和语法结构

1.函数定义

函数定义的一般形式如下:

返回值类型 函数名(参数列表)

{

函数体;

[return 返回值;]

}

(1).返回值类型:指定函数返回值的数据类型,可以是 C 语言中的任意数据类型,如int、char、float等。如果函数不需要返回值,则使用void关键字。

(2).函数名:是函数的标识符,用于调用函数,命名规则遵循 C 语言标识符的命名规范,通常使用具有描述性的名称,以便于理解函数的功能。

(3).参数列表:是由逗号分隔的变量声明,这些变量称为形式参数(简称形参),用于接收调用函数时传递的实际参数(简称实参)。参数列表可以为空,即函数没有参数。

(4).函数体:是由一对花括号包围的语句块,包含了函数要执行的具体操作。return语句用于返回函数的结果,当函数的返回值类型为void时,return语句可以省略。

三、函数的分类

在 C 语言中,函数可以分为库函数和用户自定义函数两类。

1.库函数

库函数是 C 语言标准库中提供的函数,它们已经被预先定义和实现,可以直接调用。使用库函数时,需要包含相应的头文件,头文件中声明了库函数的原型和相关的宏定义等信息。

常见的库函数包括:

(1).输入输出函数:如printf()用于输出数据到标准输出设备(通常是屏幕),scanf()用于从标准输入设备(通常是键盘)读取数据。

(2).数学函数:如sqrt()用于计算平方根,pow()用于计算幂次方等,使用数学函数需要包含头文件math.h。

(3).字符串处理函数:如strlen()用于计算字符串的长度,strcpy()用于复制字符串,strcmp()用来判断两个字符串是否相等,这些都包含在头文件string.h中。

可以通过 www.cplusplus.com来学习库函数

2.用户自定义函数

       用户自定义函数是由程序员根据自己的需求定义的函数,它可以实现特定的功能。用户自定义函数的定义需要遵循函数定义的语法规则,并且在使用之前需要进行声明(除非函数定义在调用之前)。

四、函数的参数传递​

函数调用的一般形式为:

函数名(实参列表);

     实参列表是由逗号分隔的表达式,其个数和类型必须与函数定义中的形参列表一致。函数调用时,会为形参分配内存空间,并将实参的值(或地址)传递给形参,然后执行函数体中的语句,最后返回调用处继续执行。

       在函数调用时,需要将实际参数传递给形式参数,C 语言中参数传递有两种方式:传值调用、传址调用

1.传值调用

       传值调用是将实际参数的值复制一份传递给形式参数,在函数内部对形式参数的修改不会影响到实际参数的值,因为实参和形参分别占有不同的内存块,传值调用的特点是简单易懂。

#include 

void swap(int x, int y) 
{
    int z = x;
    x = y;
    y = z;
    printf("函数内部x = %d, y = %d\n", x, y);
}

int main() {
    int a = 5, b = 10;
    swap(a, b);
    printf("主函数中a = %d, b = %d\n", a, b);
    return 0;
}

【C语言极简自学笔记】深入理解 C 语言中的函数:从基础到进阶_第1张图片

可以看到,在调用swap函数之后,a,b的值并没有被交换,实际是swap函数调用时x,y拥有了自己的空间,同时拥有了和实参一摸一样的内容,函数内部的x,y值被交换,即形参实例化后相当于实参的一份临时拷贝

2.传址调用

       传址调用是将实际参数的地址传递给形式参数,形式参数是一个指针变量,通过指针变量可以访问和修改实际参数的值。指针传递的优点是可以在函数内部修改实际参数的值,并且对于传递较大的数据结构,只需要传递地址,提高了效率。

#include 

void swap(int *x, int *y)
{
    int z = *x;
    *x = *y;
    *y = z;
    printf("函数内部*x = %d, *y = %d\n", *x, *y);
}

int main() 
{
    int a = 5, b = 10;
    swap(&a, &b);
    printf("主函数中a = %d, b = %d\n", a, b);
    return 0;
}

【C语言极简自学笔记】深入理解 C 语言中的函数:从基础到进阶_第2张图片

       在这个例子中,swap函数接受两个整数指针作为参数,通过解引用指针来访问和修改实际参数的值。调用函数时,传递的是a和b的地址(使用&运算符),函数内部成功交换了a和b的值,主函数中输出的结果也显示它们的值已经交换。 

五.实例

输出100-200之间的素数

代码1:

#include 

int main()
{
	int num = 0;
	for (num = 100; num <= 200; num++)
	{
		int i = 0;
		int flag = 1;
		for (i = 2; i < num; i++)
		{
			if (num % i == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag)
		{
			printf("%d ",num);
		}
	}
	return 0;
}

通过for循环的嵌套,当经过循环后flag仍然为1,则证明该数不可被i整除,为素数

可以将    for (num = 100; num <= 200; num++)  改为    for (num = 101; num <= 200; num+=2)

因为素数均为奇数
       将    for (i = 2; i < num; i++)      改为        for (i = 2; i < sqrt(num); i++)

因为若该数不为素数,则它的值为小于等于它的平方根的因数的乘积,因此只用判断小于它平方根的部分,使用sqrt函数时需要包含头文件 math.h

代码2

#include 
#include 
int is_prime(int n)
{
	int i = 0;
	for (i = 2; i < sqrt(n); i++)
	{
		if (n % i == 0)
		{
			return 0;
		}

	}
	return 1;
}
int main()
{
	int num = 0;
	for (num = 100; num <= 200; num++)
	{
		if (is_prime(num))
		{
			printf("%d ",num);
		}
		
	}
	return 0;
}

通过声明函数is_prime,若函数的返回值为1,证明是素数,打印;若返回值为0,则不是素数。

       函数是 C 语言的核心概念之一,它为程序的模块化设计和代码复用提供了强大的支持。本文介绍了函数的基本概念、定义和语法结构、分类、参数传递方式、调用等方面的知识。希望通过本文的学习,能够对 C 语言中的函数有更深入的理解,并能够熟练地运用函数进行程序设计。在实际编程中,要根据具体的需求选择合适的函数类型和参数传递方式,合理使用递归解决问题,同时注意函数的声明和调用规则,避免出现错误。不断实践和积累经验,才能更好地掌握 C 语言函数的精髓,编写出高效、可靠的 C 程序。 

你可能感兴趣的:(【C语言极简自学笔记】深入理解 C 语言中的函数:从基础到进阶)