引言
C语言及函数在编程中的重要性
引用小说《雪中悍刀行》一句话概括C语言中函数的重要性,“天不生我李淳罡,剑道万古如长夜。”函数在编程中的重要性就和李淳罡在剑道的重要性一样。
C语言函数在代码重用、模块化设计、函数参数、函数调用栈和递归等方面都发挥着重要的作用。正确地使用函数可以提高程序的效率、可读性和可维护性。
函数组成成分
C语言中的函数由以下几部分组成:
- 函数名:函数名是函数的标识符,用于在程序中调用该函数。函数名应该具有描述性,以便于理解函数的功能。
- 参数列表:参数列表包括函数接受的输入参数的类型、顺序和参数的数量。参数列表中的每个参数都有一个类型和一个标识符。
- 函数返回值类型:函数返回值类型是函数执行后返回的数据类型。如果函数不返回任何值,则返回值类型为 void。
- 函数体:函数体是包含函数具体执行的代码块的语句块。它定义了函数如何执行,包括输入参数的处理和返回值的计算。
要创建一个函数,就要包含以上几个基本要素。
下面是一个简单的例子,展示了C语言函数的组成:
int add(int a, int b) // 函数名:add,参数列表有两个 int 类型的参数 a 和 b
{
int result = a + b; // 计算 a 和 b 的和,存储到 result 变量中
return result; // 返回 result 的值
}
在这个例子中,函数名为 add,参数列表有两个 int 类型的参数 a 和 b,函数返回值类型为 int,函数体包含计算 a 和 b 的和并将结果存储到 result 变量中的语句,最后通过 return 语句返回 result 的值。
在C语言中,形参和实参是函数的重要组成部分。
形参概述
形参(formal parameter): 全称为"形式参数",是在函数定义时列在函数名后面括号中的变量,目的是用来接收调用该函数时传递的参数。
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
实参概述
实参(actual parameter): 全称为"实际参数",实参是调用函数时传递给函数的实际值,它们可以是常量、变量或表达式。
实参的作用是提供函数执行所需的数据,并在函数内部使用。
实参与形参的联系
其中,实参和形参在数量、类型和顺序上必须一致,否则会导致编译错误。
在C语言中,形参和实参的数据类型必须兼容,即它们之间可以进行类型转换。
具体来说,如果形参是基本数据类型,例如int,而实参是double类型,那么实参会通过类型转换将double类型转换为int类型,然后传递给形参。
如果形参是结构体类型,而实参是另一个不同的结构体类型,那么实参需要通过结构体赋值或复制的方式转换为与形参相同的结构体类型。
如果形参是指针类型,而实参是另一个不同的指针类型,那么实参需要通过指针转换的方式转换为与形参相同的指针类型。
总之,在函数调用时,实参的数据类型必须与形参兼容,或者可以通过类型转换的方式转换为兼容的类型。
形参与实参的区别
生命周期的差异
形参的作用域仅限于函数内部,一旦函数执行结束,形参的生命周期也就结束了。
实参的作用域通常只限于函数调用期间,函数运行结束,实参的生命周期也就结束了。
从生命周期的角度来看,形参的生命周期短于实参。
存储位置的差别
实参和形参都有各自独立的存储空间,它们之间并不共享内存。
#include <stdio.h>
void func(int a, int b)
{
printf("a = %p, b = %p\n", &a, &b);
}
int main()
{
int x = 10, y = 20;
printf("x = %p, y = %p\n", &x, &y);
func(x, y);
return 0;
}
如上图,可以看到,x和y的地址和a和b的地址是不⼀样的。
如上图,x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不⼀样的,所以我们可以理解为形参是实参的⼀份临时拷贝。