1、实参形参的区别
(1) 实参是属于函数调用者的对象,然后传递给函数被调者;而形参是属于函数被调者的。
(2)形参和实参的数据类型要一致。
(3) 对于不带回值的函数,应当用定义函数为“void”类型(即 空类型)
2、函数的参数传递与返回
(1) 被调函数的形参与调⽤者的实参其实是两个不同的对象 , 即便在函数中任意修改形参的值都不会影响main函数中对象的值。
3、通过形参修改实参的值
(1)通过形参修改实参的值的办法就是利用指针
举个例子
//
没有用到指针
#include <stdio.h>
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int num0 = 3;
int num1 = 5;
swap(num0, num1);
printf("num0 is : %d\n", num0);
return 0;
}
//输出结果是 num0 is : 3
/
/用到指针
#include <stdio.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int num0 = 3;
int num1 = 5;
swap(&num0, &num1);
printf("num0 is : %d\n", num0);
return 0;
}
//输出结果是 num0 is : 5
4、带有不定参数类型及个数的函数声明与调⽤
1、C语⾔函数的形参类型列表的最后可以带有不定参数类型及个数的形参列表,⽤(,…)来表⽰。C语⾔标准明确规定,含有不定参数个数的形参列表中,必须要有⼀个确定的命名形参,并且…后不能再跟其他形参。错误示例如下:
//
// 错误!在 ... 之前必须⾄少要有⼀个命名形参
void Func1(...);
// 错误!在 ... 之后不能再跟任何形参
void Func2(int a, ..., int b);
//
5 函数的递归调用
在调用一个函数的时候又出现直接或间接的调用该函数的本身,称为该函数的递归调用。
举例
#include <stdio.h>
#include <stdlib.h>
int main()
{
int fac(int n); //定义函数
int n,y;
printf("input an interger number:");
scanf("%d",&n);
y = fac(n); //引用函数
printf("%d != %d\n",n,y);
return 0;
}
int fac(int n)
{
int f;
if(n < 0)
printf("n < 0,data error!");
else if(n == 0 || n == 1)
f = 1;
else f = fac(n - 1) * n ; //函数的递归
return(f);
}
函数的局部变量和整体变量应用
# define LOW 10
# define HIGH 5
# define CHANGE 2
int i = LOW ;
#include <stdio.h>
void main( )
{ int workover ( int i ) , reset ( int i );
int i = HIGH ;
reset ( i / 2) ;
printf(" i = %d \n ", i ); //以下输出的i都为i = HIGH的值
reset ( i = i / 2) ; //此时i = HIGH变成了i = HIHG / 2
printf(" i = %d \n ", i );
reset ( i / 2) ;
printf(" i = %d \n ", i );
workover ( i );
printf(" i = %d \n ", i );
}
int workover ( int i )
{ i = ( i % i ) * (( i * i ) / ( 2 * i ) + 4) ;
printf(" i = %d \n ", i );
return ( i );
}
int reset ( int i )
{ i = i <= CHANGE ? HIGH : LOW ;
return ( i ); //此时虽然返回了i的值但是没有对返回值赋值给上面的全局变量
}
所以有以下的结果