函数中的参数起到了传递数据的作用,函数调用者可以通过函数参数把函数内部需要的数据从外部传递过去。例如下面的代码定义了函数summation,它有一个参数number,函数需要这个参数来计算自然数的累加和。调用者调用函数时,需要传入一个自然数进去。
int summation(int number)
{
int i,sum = 0;
for( i = 0; i<sum; i++ )
{
sum += i;
}
return sum;
}
函数summation,它有一个参数number,函数需要这个参数来计算自然数的累加和。调用者调用函数时,需要传入一个自然数进去。

summation函数首部的参数称为形参,调用summation函数时传入的参数称为实参。例如在summation函数中,函数首部的number是形参,调用summation函数传入的自然数10、20、100是实参。这里需要注意的是,函数声明时的形参数量和调用函数时传入的实参数量要一致,声明的形参顺序和传入的实参顺序也要一致,形参类型和实参类型也要一致。

一、指针参数
C语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。
例【1】 指针参数练习
程序清单 sample.c
#include<stdio.h>
void swap(int *pa,int *pb);
void main()
{
int a = 20,b=30;
// 调用swap函数,交换变量a和b的值
swap(&a,&b);
printf("a=%d,b=%d",a,b);
}
//定义交换两个变量值的函数
void swap(int *pa,int *pb)
{
// 定义临时变量temp,pa值赋值给temp
int temp = *pa;
// pb的值赋值给pa
*pa = *pb;
// temp赋值给pb
*pb = temp;
}
例8-3演示了指针参数的作用,swap()函数的形参是指针变量pa和pb,函数完成pa和pb值的交换。main()函数声明了两个整数变量a和b,并调用swap()函数完成变量a和b值的交换,传入的参数为变量a和变量b的地址。
二、可变参数
在实际编程中,还会遇到这样的情况:要求编写一个函数,实现求多个自然数的平均值。这就有点难度了,求多个自然数的平均值不难,难就难在要用函数来实现,求平均值的自然数个数又不确定,如何声明函数的形参呢?
这就要用到可变参数了,可变参数允许调用函数时传入的参数是可变的,可以是1个实参、2个实参或者多个实参。标准函数库的printf()、scanf()等函数的参数就是可变参数,其函数声明(或函数原型)为:
int printf(const char* format,…)
int scanf(const char *format,…)
printf()函数和scanf()函数的第1个参数为const char*类型的参数,const关键字用来修饰声明的变量为常量,其值不可修改,const char*是一个指向字符常量的指针。第2个参数是一个可变参数,使用三个点“…”作为参数占位符。
任何一个可变参数的函数都可以分为两部分:固定参数和可选参数。至少要有一个固定参数,其声明与普通函数参数声明相同;可选参数由于数目不定(0个或以上),声明时用"…"表示。固定参数和可选参数共同构成可变参数函数的参数列表。
例【2】 可变参数练习
程序清单 sample.c
#include <stdio.h>
int average(int n,...);
void main()
{
printf("平均值=%d",average(3,21,32,78));
}
// 定义传入可变参数的函数
// 参数n为可变参数个数
int average(int n,...)
{
int i,sum=0,result = 0;
// 第1个参数的地址赋值给指针变量p
int *p = &n;
// p指向第2个参数的地址
p = p+1;
for( i = 0; i<n; i++ )
{
sum += *p;
// p指向下一个参数的地址
p++;
}
return sum/n;
}