9.3.1 形参和实参

形参在函数定义中出现,在整个函数体内都可以使用,但离开当前函数则不能使用。实参在主调函数中出现,当进入被调函数后,实参变量也不能使用。形参和实参的功能是进行数据传送,当调用函数时,主调函数会把实参的值传送给被调函数的形参,从而实现主调函数向被调函数传送数据。

C语言函数的形参和实参具有以下特点。

❑ 形参变量只有在调用时才分配内存单元,在调用结束后,即刻释放所分配的内存单元。因此,形参只在函数内部有效。结束函数调用返回主调函数后则不能再使用该形参变量。

❑ 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使实参获得确定值。

❑ 实参和形参在数量、类型、顺序上应严格一致,否则会发生“类型不匹配”。

❑ 函数调用中的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用中,形参的值会发生改变,而实参中的值不会变化。

实例9-2

提示用户输入1个数字,然后计算从1到此数字值的和,并输出结果

源码路径daima\9\9-2

本实例的实现文件为“xing.c”,具体实现代码如下。

    int main(void)
    {
        int n;                           //声明变量
        printf("input number\n");
        scanf("%d", &n);                 //输入一个数字
        s(n);                            //此处n为实参
        printf("n_M=%d\n", n);           //输出n的值
    }
    int s(int n)                         //此处n为形参
    {
        int i;
        for(i=n-1; i>=1; i--)
        n=n+i;
        printf("n_S=%d\n", n);           //输出1到n的和
    }

拓展范例及视频二维码

范例9-2-01:形参和实参的单向传递

源码路径:演练范例\9-2-01\

范例9-2-02:演示函数参数的求值顺序

源码路径:演练范例\9-2-02\

上述代码定义了一个函数s,该函数的功能是求自然数1~n的和。在主函数中输入n,并作为实参,在调用时将它传送给函数s的形参n(注意,本例的形参和实参的标识符都为n,但它们是两个不同的量,各自的作用域不同)。在主函数中用printf语句输出一次n值,这个n值是实参n的值。在函数s中也用printf语句输出了一次n值,但这个n值是形参最后取得的n值,它为0。从运行情况看,输入的n值为100。即实参n的值为100。把此值传给函数s时,形参n的初值也为100,在函数执行过程中,形参n的值变为5050。程序返回主函数之后,实参n的值仍为100。可见实参的值不随形参的变化而变化。

程序运行后将先提示用户输入一个整数,输入完毕并按下Enter键后将会进行求和运算,并输出计算结果。执行效果如图9-2所示。

图9-2 执行效果