C零基础课程-23-函数的参数与返回值、变参

函数的参数

函数调用时,参数的个数与类型,必须与函数原型匹配。

形参与实参

函数调用时,传递的参数,称为实参;函数定义时,在参数列表中声明的参数,叫做形参。
函数在调用的过程中,实参传递的过程,其实会复制一份给形参,因此,函数内部形参的值的改变,不会影响到调用方传递的实参。

void FakeChangeValue(int x)
{
    x += 5;
    printf("函数内部改变数值后:%d\r\n", x);
}

void main(void)
{
    int nValue = 100;
    printf("nValue: %d\r\n", nValue);
    FakeChangeValue(nValue);
    printf("nValue: %d\r\n", nValue);
}

再比如,以下的函数,并没有办法交换两个变量的值:

void FakeSwap(int x, int y)
{
    int nTemp = y;
    y = x;
    x = nTemp;
}

函数的返回值

函数使用return语句进行返回,使用return有两方面的内涵:

  • 结束当前函数的执行,返回到上一层的调用方
  • 将对应的返回值,带回给调用方
#include <stdio.h>


int AddTwoNumber(int x, int y)
{
    printf("返回之前的语句\r\n");
    return x + y;
    printf("返回之后的语句\r\n");
}
void main(void)
{
    int nValue = 0;
    nValue = AddTwoNumber(10, 20);
    printf("%d\r\n", nValue);
}

return后接的返回值,应该与函数原型一致,针对void返回值类型,就需要只return不带返回值:

#include <stdio.h>


void VoidFun()
{
    printf("返回之前的语句\r\n");
    return;
    printf("返回之后的语句\r\n");
}
void main(void)
{
    VoidFun();
}

变参函数

函数的声明和实现中,参数列表中可以出现

...

它代表实参传递来的参数个数不做限制。
实际上,我们使用的printf就是这样的函数:

在C标准库中,提供了va_list, va_start等宏,看以下的例子,通过变参函数及相关宏,计算可变数目的参数的和:

#include <stdio.h>
#include <stdarg.h>

int Sum(int nFirst, ...)
{
    int nSum = 0, i = nFirst;

    va_list marker;

    va_start(marker, nFirst);
    while (i != -1)
    {
        nSum += i;
        i = va_arg(marker, int);
    }
    va_end(marker);
    return nSum;
}

void main(void)
{
    printf("求和: %d\n", Sum(2, 3, 4, -1));
    printf("求和: %d\n", Sum(5, 7, 9, 11, -1));
    printf("求和: %d\n", Sum(-1));
}

使用va_系列宏知道:

  • 必须起码有一个形参
  • 使用va_start和第一个形参初始化
  • 使用va_arg拿下一个参数
  • 使用va_end反初始化
  • 调用方要么使用约定好的参数作为结束标志,要么预先传递实参个数

猜你喜欢

转载自www.cnblogs.com/shellmad/p/11646264.html
今日推荐