n);
p=sumt(n); /*函数调用*/
printf("\n %ld",p);
}
long sum( int m){ /*函数定义*/
int i;
long s=0;
for(i=1;i<=m;i++)
s+=i;
return(s); /*函数返回*/
}
2被调用函数在主函数之前:
#include "stdio.h"
long sum( int m){ /* 函数定义*/
int i;
long s=1;
for(i=1;i<=m;i++)
s+=i;
return(s);
}
main(){
int n;
long p; /*不需函数声明*/
scanf("%d",&n);
p=sum(n); /*函数调用*/
printf("\n %ld",p);
}
3被调用函数在另一个文件中,首先我们设sum()函数存放在fun.c中,则编写主调用函数时需用include命令对被调用函数声明:
#include "fun.c"
main(){
int n=7;
n=sum(n);
}
4参数传递
4.1形式参数和实际参数
参数传递中的数据变化:
#include "stdio.h"
void fun(int num) {
num=20;
printf("%d\n",num);
}
main(){
int x;
x=10;
fun(x); /(调用函数无返回值的函数fun*/
printf("%d\n",x);
}
运行结果:
20
10
函数fun有一个形参变量num,当main函数调用时,实参x的值传送到num,在fun函数中虽然num被修改为20,但是并不影响x的值。
程序从main开始运行,这是x拥有储存空间,初值为10,当fun函数被调用时,为形参分配空间,接受实参的值,流程转到调用函数fun中执行,为变量num重新赋值为20,次数赋值对实参没有影响,同时实参在fun函数中也不可用,函数调用结束后,形参空间撤销,流程返回。这就是值传递。
当函数有多个参数时,在调用实参列表的求值顺序是并不确定的,不同的系统可能不同,如果想知道自己系统的求值顺序可以使用自增、自减来测试:
#include "stdio.h"
int f(int a,int b,int c)
{
int z;
z=a+b*c;
return z;
}
main()
{
int x=3,y;
y=f(x,x++,x++); /*由右至左对实参求值*/
printf("%d\n",y);
}
运行结果:17.
4.2函数的返回值:一个函数的实现都是含有特定的功能,有时函数执行结束后需要将执行结果返回给调用函数,这个结果就可以通过返回值表现出来,返回值使用return语句来实现,具体格式是:
return 表达式; 或return (表达式);
该语句的功能就是返回一个值给主调用函数,释放函数在执行过程中分配的所有空间,结束被调用函数的运行,将流程控制交给主调函数。
如果没有返回值可以使用renturn ;来代替。
float fun(int n){
return n;
}
main(){
float x;
x=f(20);
printf("%f",x);
}
5数组作为函数的参数
当数组作为参数传递时,系统就会将作为实参的数组元素首地址传递给形参所表示的数组名,即参数传递时地址传递。
5.1一维数组作为参数:一维数组名表示数组中下标为0的元素在内存中的起始地址。假设数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值,是指针型数据。
数组作为参数传递的例子代码:
#include "stdio.h"
void input(int a[10],int n) { /*输入函数*/
int i;
for(i=0;i
scanf("%d",&a[i]);
printf("\n");
}
int maxa(int a[10],int n) { /*求最大值函数*/
int i;
int m;
m=a[0];
a[1]=100;
for(i=1;i
if (m
return m;
}
void print(int a[10],int n) { /*输出函数*/
int i;
for(i=0;i
printf("%4d",a[i]);
printf("\n");
}
void main() {
int b[10];
int max;
input(b,10);
max=maxa(b,10);
printf("array max is %d\n",max);
printf("the array is :\n");
print(b,10);
}
地址传递就是形参和实参同时指向同一个地址,修改在改存储单元上的数据。
6函数的嵌套调用
C语言中不允许嵌套的函数定义,但允许函数嵌套的调用,即在被调用函数中又调用其他函数。
嵌套调用的程序结构:
哥德巴赫猜想例子代码:
#include "stdio.h"
#include "math.h"
int prime (int); /*函数声明*/
void even(int);
main(){
int n;
printf("Enter n even number(>=6):");
scanf("%d", &n);
if(n%2==0&&n>=6)
even(n); /*函数调用语句*/
else
printf("The %d isn't even number\n",n);
}
void even(int x) { /*找素数函数*/
int i;
for(i=2;i<=x/2;i++)
if(prime(i)) /*调用判断素数函数*/
if(prime(x-i)){
printf("%d=%d+%d\n",x,i,x-i); }
}
int prime(int n) /*判断素数函数*/
{ int i, k= sqrt(n);
for(i=2; i<=k; i++)
if (n%i==0) return 0;
return 1;
}
7函数的递归调用
7.1递归的含义:函数直接或间接的对自己进行调用就是递归。
例如:
int f(int x){
int y;
z=f(y);
return z;
}
这个函数就是递归的调用自己,但该函数会无止境的运行下去,这显然是不正确的,编写代码时应该给程序一个跳出递归的出口。
8练习
1递归求