C 函数的形参和实参
在 C 语言中,函数的参数可以分为 2 种:形参和实参。其中函数在定义时的参数叫做 “形参”(形式上的参数),而函数在调用时的参数叫做 “实参”(实际上的参数)。
示例 1:C 形参和实参
#include <stdio.h>
int getSum(int a, int b) // a 和 b 是形参
{
return a + b;
}
int main(void)
{
int sum = getSum(10, 20); // 10 和 20 是实参
printf("%d", sum);
return 0;
}运行结果如下。
30分析:
从名字上就可以很容易区分,形参本质上是一个变量,实参本质上是一个数值。我们调用函数时,其实就是把实参作为值,然后赋值给形参。是不是感觉很熟悉?其实这个跟变量的赋值是一样的,非常的简单。
对于 getSum(10, 20) 来说,它其实就是将 10 赋值给 a,并且将 20 赋值给 b,相当于下面代码。
int a = 10;
int b = 20;提示: 对于基本数据类型(如 int、float、char 等),C 语言采用的是 “值传递”(pass by value)的方式,也就是说,在函数调用时,实参的值会被复制一份传递给形参,函数内部对形参的修改不会影响到实参本身。
数组作为函数参数
之前我们接触的参数都是一些基本类型,比如 int、float 等。实际上在 C 语言中,数组也可以作为函数的参数。
示例 2:求数组最大值(函数实现)
#include <stdio.h>
// 定义函数
int getMax(int arr[], int length)
{
int temp = arr[0];
for (int i = 1; i < length; i++)
{
temp = temp > arr[i] ? temp : arr[i];
}
return temp;
}
int main(void)
{
// 定义数组
int arr[] = {36, 42, 33, 64, 97, 15, 84, 21, 75, 52};
// 求数组长度
int length = sizeof(arr) / sizeof(arr[0]);
// 调用函数
printf("%d", getMax(arr, length));
return 0;
}运行结果如下。
97分析:
在这个例子中,我们定义了一个 getMax() 函数用于求数组中的最大值。getMax() 有 2 个参数:一个是数组本身,另一个是数组长度。实现思路很简单,无非就是把数组和长度作为参数传进去处理,然后在函数内部遍历整个数组,然后求出最大值。
在函数定义中,当数组作为形参时,可以不指定数组的大小。但为了在函数内部正确地处理数组,通常需要将数组的大小作为另一个参数传递给函数,就像上面的 length 参数一样。
一般来说,如果想要在一个函数中对数组进行处理,我们一般都需要传入 2 个参数:数组和长度。这也是通用的做法,小伙伴们可以先简单记一下。
此外,在函数内部,传递进来的数组名 arr 会被当作一个指向数组第一个元素的指针来处理。因此,arr[i] 实际上是通过指针运算访问数组元素的。
提示: 与基本数据类型的值传递不同,当数组作为函数参数传递时,实际上是传递了数组的首地址(即指向数组第一个元素的指针)。这意味着函数内部对数组元素的修改会直接影响到原始数组。这种传递方式类似于 “地址传递”。
