《C语言教程》16章 函数和参数的关系


函数里面的数据要和函数外面的数据相互传递,用什么方法呢?有人马上想到全局变量。这的确可以,但不是好方法,因为数据随时有可能被其它函数修改。也有人想到静态变量,说明这人还没明白静态变量的要领,请翻到前一章阅读。函数内部与外部数据交换,正确的方法是使用参数和返回值。

一、参数与返回值的关系

对于函数来说,外部数据要传到内部时,称之为“输入”,函数内部数据传到外部,称之为“输出”。返回值只能输出而不能输入。当需要多个输入数据,而只需要一个输出数据时,一般用参数来输入,而用返回值作输出。


#include <stdio.h>

int sum(int, int);    //申明时参数可以只写类型

int main(void)
{
    int x, y, z;

    printf("请输入x和y的值:");
    scanf("%d %d", &x, &y);

    z = sum(x, y);    //调用函数求和
    printf("%d + %d = %d \n", x, y, z);

    return 0;
}

int sum(int num1, int num2)
{
    return num1 + num2 ;
}

二、基本类型作参数

当需要多个输入和输出时,就可以考虑使用参数。参数既能输入又能输出,但基本类型作参数时,只能输入,不能输出。下面的例子不能得到满意的结果,就是因为基本类型的变量作参数。


#include <stdio.h>

void change(int, int);

int main(void)
{
    int x, y ;

    printf("请输入x和y的值:");
    scanf("%d %d", &x, &y);

    printf("\n交换前: x = %d,  y = %d \n", x, y);
    change(x, y);    //调用函数交换数据
    printf("\n交换后: x = %d,  y = %d \n", x, y);

    return 0;
}

void change(int num1, int num2)
{
    int temp;

    printf("\n交换前: num1 = %d,  num2 = %d \n", num1, num2);
    temp = num1 ;
    num1 = num2 ;
    num2 = temp ;
    printf("交换后: num1 = %d,  num2 = %d \n", num1, num2);

    return ;
}

三、指针变量作参数

基本类型作参数时,C语言使用“值传送”的方法,非基本类型则采用的是“地址传送”的方法。因此,上面的问题可以改成指针作参数,问题便迎刃而解。由此可知,前面章节讲到scanf()函数时,当输入int类型数据时,为什么要用&加在变量前。


#include <stdio.h>

void change(int *, int *);

int main(void)
{
    int x, y ;

    printf("请输入x和y的值:");
    scanf("%d %d", &x, &y);

    printf("\n前:x=%d, y=%d\n", x, y);
    change(&x, &y);    //调用函数交换数据
    printf("\n后:x=%d, y=%d\n", x, y);

    return 0;
}

void change(int *num1, int *num2)
{
    int temp;

    printf("\n前:*num1=%d, *num2=%d\n", *num1, *num2);
    temp = *num1 ;
    *num1 = *num2 ;
    *num2 = temp ;
    printf("后:*num1=%d, *num2=%d \n", *num1, *num2);

    return ;
}

四、const可防止参数被修改

基本类型作参数时,在函数中即使被修改也不能传回去,但如果是指针,修改之后就一定会改变调用处变量的值。C语言中,在参数前加上const便可阻止被修改的现象。


#include <stdio.h>

void print(char *, const char *);

int main(void)
{
    char x[] = "quanxue";
    char y[] = "C Language" ;

    print(x, y);

    return 0;
}

void print(int *s1, const int *s2)
{
    s1[0] = 'Q', s1[4] = 'X';    //将q→Q,x→X
//  s2[0] = 'c', s2[2] = 'L';    //这句编译错误

    printf("%s\n%s\n", s1, s2);

    return ;
}