> 文章列表 > C语言 —— 函数(一)

C语言 —— 函数(一)

C语言 —— 函数(一)

C语言函数

  • 一、C语言函数概念与定义方式
    • 1.1、C语言的函数概念
    • 1.2、函数定义的方式
      • 1.2.1 、C语言无参函数的定义
      • 1.2.2、C语言有参函数的定义
      • 1.2.3、**!!!** 注意:C语言函数不能相互嵌套
    • 1.3、例如:定义一个函数,计算从 1 加到 100 的结果:
  • 二、C语言函数的类型
  • 三、C语言函数形参与实参
    • 3.1 函数形参
    • 3.2函数实参
    • 3.3 形参和实参的区别

一、C语言函数概念与定义方式

1.1、C语言的函数概念

在C语言中,函数是一段具有特定功能的代码块,可以通过函数名来调用并执行其中的代码。函数通常被用来实现可重复使用的代码,将大问题分解为小问题,从而提高编程的效率和可读性。

在C语言中,函数由函数定义函数原型两部分组成。

函数定义包含函数名、参数列表、函数体,以及可选的返回值类型和返回语句。一个典型的函数定义的语法如下:

return_type function_name(parameter1_type parameter1_name, parameter2_type parameter2_name, ...) {// function bodyreturn return_value;
}

其中:
return_type
指定函数的返回值类型,可以是任何C数据类型,可以省略表示不返回任何值(即返回类型为 void)。
function_name
是函数的名称,用于在其他地方调用函数。
parameter_type parameter_name
定义了函数的参数,可以包含零个或多个参数,每个参数由参数类型和参数名称组成。参数类型指定参数的数据类型,参数名称指定了该数据在函数内的名称。
函数体
是指在函数被调用时要执行的实际代码。
return_value
表示函数的返回值,它的类型必须与 return_type 指定的类型相同。如果函数不需要返回任何值,则可以省略该语句。

函数原型是函数的声明,它声明了函数的名称和参数列表,但不包含函数体。函数原型的语法如下:

return_type function_name(parameter1_type parameter1_name, parameter2_type parameter2_name, ...);

在编写C程序时,通常会将所有的函数原型和全局变量声明放在头文件中,并在需要使用这些函数和变量的源文件中包含这些头文件,以便于函数的调用和数据的使用。

1.2、函数定义的方式

在C语言中,定义函数的方式需要使用如下的基本结构:

返回类型 函数名称(参数列表) {函数体;return 返回值; }

其中,返回类型指定了函数返回值的数据类型,如果函数不需要返回值,可以使用void关键字表示。
函数名称是由用户自定义的,可以是任何符合标识符规则的字符序列。
参数列表指定了函数接受的参数以及其数据类型,如果函数不接受任何参数,则可以使用void关键字表示。
函数体内部包含一系列语句,用于实现函数的具体功能。最后,函数通常使用return语句返回一个结果,结果的类型必须与函数的返回类型匹配。如果函数不需要返回值,可以省略return语句。

例如,下面是一个简单的C函数,用于计算两个数的和:

int add(int x, int y) {int sum = x + y;return sum;
}

其中,add函数接受两个int类型的参数x和y,在函数体中计算它们的和,并将结果存储在变量sum中,最后使用return语句返回sum的值。在代码中,可以使用add(x, y)来调用这个函数,其中x和y是用户指定的两个整数。

1.2.1 、C语言无参函数的定义

定义时可以不带参数。如下所示:

dataType  functionName(){//body
}

dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
functionName 是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
body 是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
如果有返回值,在函数体中使用 return 语句返回。return 出来的数据的类型要和 dataType 一样。

1.2.2、C语言有参函数的定义

定义时就要带上参数。如下所示:

dataType  functionName( dataType1 param1, dataType2 param2 ... ){//body
}

dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
functionName 是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
body 是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
dataType1 param1, dataType2 param2 ...是参数列表。函数可以只有一个参数,也可以有多个,多个参数之间由 , 分隔。参数本质上也是变量,定义时要指明类型和名称。与无参函数的定义相比,有参函数的定义仅仅是多了一个参数列表。

1.2.3、!!! 注意:C语言函数不能相互嵌套

C语言不允许函数嵌套,不能在一个函数中定义另外一个函数,必须在所有函数之外定义另外一个函数。main() 也是一个函数定义,也不能在 main() 函数内部定义新函数。
C语言 —— 函数(一)
one()、two()、main() 三个函数是平行的。

在标准的 C 语言中,函数不能在另一个函数的内部定义。也就是说,不能在某一个函数的代码块(花括号括起来的一段代码)中定义一个函数,这样就不能实现函数的嵌套定义。

但是,可以在一个函数中调用另一个函数,而被调用的函数可以是同一文件中的其他函数或者是库文件中的函数,这种方式也可以实现函数的嵌套调用。这种嵌套调用的方式可以使程序的结构更加清晰,代码更易于阅读和维护。

1.3、例如:定义一个函数,计算从 1 加到 100 的结果:

代码:
#include <stdio.h>
int sum(){
int i, sum=0;
for(i=1; i<=100; i++){
sum+=i;
}
return sum;
}
int main(){
int a = sum();
printf(“1-100的和 %d\\n”, a);
return 0;
}

结果:
C语言 —— 函数(一)

二、C语言函数的类型

C语言中函数的类型包括以下几种:
1、无返回值函数(void function):
这是最常用的函数类型之一。无返回值函数中不必有return语句,或者有return语句但不带返回值。例如:

void print_hello() {printf("Hello\\n");
}

2、带返回值函数(non-void function):
带返回值函数需要指定返回值的类型,并在函数中使用return语句返回具体的值。例如:

int add(int x, int y) {return x + y;
}

3、带指针参数函数(pointer function):
函数的参数可以是指向某种数据类型的指针(pointer)。指针可以使函数更加灵活,允许函数修改参数指向的数据。例如:

void swap(int *x, int *y) {int temp = *x;*x = *y;*y = temp;
}

4、带数组参数函数(array function):
函数的参数可以是数组,这样允许函数处理大量数据。数组的长度不应硬编码在函数中,而应该使用函数参数传递。例如:

int sum(const int arr[], int len) {int s = 0;for (int i = 0; i < len; i++) {s += arr[i];}return s;
}

5、可变长参数函数(variadic function):
这类函数允许传递不定数量的参数。C语言提供了stdarg.h库支持这种函数类型。例如:

#include <stdarg.h>
double average(int count, ...) {va_list argptr;double sum = 0.0;int i;va_start(argptr, count);for (i = 0; i < count; i++) {sum += va_arg(argptr, double);}va_end(argptr);return sum / count;
}

三、C语言函数形参与实参

在编程中,函数被用来执行一系列任务,并且可以被多次调用。函数可以接收输入参数,这些参数被称为函数的形参,也可以返回一个结果。当函数被调用时,需要提供实参来替换函数定义中的形参。

3.1 函数形参

形参是定义在函数上下文中的变量,它们在函数定义时被指定,并用于传递值到函数体中。形参是函数定义中的占位符,它们定义了函数的接口。这意味着,当函数被调用时,它们将被替换为实际值。

下面是一个简单的函数定义和调用的例子,在此例子中,x 和 y 是形参:


def add(x, y):result = x + yreturn result
sum = add(3, 4)  # 调用 add 函数,并传递实参 34 给形参 x 和 y
print(sum)  # 输出 7

在这个例子中,函数 add 被定义为接受两个参数 x 和 y。当函数被调用时,3 被传递给 x,4 被传递给 y。函数体内部使用这些形参计算 result 的值,然后返回计算结果。在这种情况下,sum 变量将包含函数的返回值,即 7。

3.2函数实参

实参是在函数调用时提供给函数的值。当函数被调用时,传递给函数的实参的数量和顺序与函数定义中的形参相匹配。实参的值被传递给函数的形参,以便函数使用这些值执行相应的操作。

在下面的代码中,3 和 4 是函数 add() 的实参:

sum = add(3, 4)

在调用 add() 函数时,3 是传递给形参 x,4 是传递给形参 y。当函数被调用时,形参 x 的值被设置为 3,形参 y 的值被设置为 4。函数体使用这些值计算结果,并将结果返回给调用者。

总之,形参是函数定义中的占位符,而实参是在函数调用时提供给函数的值。当函数被调用时,实参的值代替形参,并在函数体中使用。

3.3 形参和实参的区别

1、形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
2、实参出现在主调函数中,进入被调函数后,实参也不能使用。
3、实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。
4、在调用函数时,编译系统临时给形参分配存储单元。调用结束后,形参单元被释放。
5、形参是函数定义时声明的参数,只是为了定义函数的接口而存在,不占用内存空间;
6、实参是函数调用时实际传递的参数值,它们占用内存空间,必须与形参的类型和顺序完全匹配。
7、实参单元与形参单元是不同的单元。调用结束后,形参单元被释放,函数调用结束返回主调函数后则不能再使用该形参变量。实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。