(八)函数

在一个函数中调用另一个函数,需要具备的条件如下:
1、首先被调用的函数必须是已经存在的函数(库函数或者用户自己定义的函数)
2、如果使用库函数,需要再本文件开头用#include命令调用有关函数库时所需要的信息包含到本文件中
3、如果使用用户自己定义的函数,而该函数的位置在调用他的函数的后面,应该在主调用幻术中对被调用的函数作声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
void main()
{
float add(float x, float y);//对函数add声明
float a,b,c;
scanf("%f,%f,%f",&a,&b,&c);
c = add(a,b);
printf("sum is %f\n",c);
}

float add(float x, float y)//函数首部
{
float z; //函数体
z = x + y;
return(z);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
类型标识符 函数名()
{
声明部分
语句部分
}

int max(int x,int y)
{
int z;
z = x>y ? x : y;
return(z);
}

//空函数
void dummy()
{

}
void main()
{
float verage(float array[10]);
float score[10];aver;
}

float average(float array[10])
{
int i;
float aver,sum = array[0];
for(i=1;i<10;i++)
{
sum += array[i];
}
aver = sum/10;
return aver;
}

局部变量和全局变量

变量的存储类别

动态存储方式与静态存储方式

全局变量全部存放在静态存储区中,在程序开始执行的时候给全局变量分配存储区,程序执行完就释放,在程序执行过程中他们占据固定的存储单元,而不是动态得进行分配和释放

动态存储区中存放的数据有
1、函数形式参数,在调用函数时给形参分配空间
2、自动变量 为加staic生命的局部变量
3、函数调用时的现场保护和返回地址等

auto变量

函数中的局部变量,如果不专门生命为static存储类别,都是动态的分配存储空间,数据存储在动态存储区中。因此这类局部变量称为自动变量,用关键字auto作存储类别的声明

static声明局部变量

如果希望函数中的局部变量的值在函数调用后不消失而保留原值,使其占用的存储单元不释放,在下一次该函数调用时,该变量已优质,就是上一次函数调用结束时的值,这时就应指该局部变量为静态局部变量,用static进行声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
void main()
{
int f(int);
int a=2,i;
for(i=0;i<3;i++)
{
printf("%d",f(a));
}
}
int f(int a)
{
auto int b=0;
staic int c = 3;
b = b+1;
c = c+1;
return(a+b+c);
}

register变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
寄存器变量

一般情况下,变量的值是存放在内存中,当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中,经过运算器进行计算,如果需要村塾,再从运算器将数据送到内存中存放

如果一些变量使用频繁,那么就浪费很多是按在运算器和内存的读取上,,为了提高效率,C语言允许将局部变量的值放在CPU的寄存其中,需要时直接从寄存器中取出参加运算,不必再到内存中去存取,由于寄存器的存取速度远高于内存的存取速度,因此可以提高执行效率


#include <stdio.h>
void main()
{
long fac(long n);
long i,n;
scanf("%ld",&n);
for(i=1;i<=n;i++)
{
printf("%ld\n",i,fac(i));
}
}

long fac(long n)
{
register long i,f=1;
for(i=1;i<n;i++)
{
f=f*i;
return(f);
}
}

【注意】

  • 只有局部自动变量和形式参数可以作为寄存器变量,其他不行,在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束释放寄存器,此后,在调用另一个函数时又可以利用他来存放该函数的寄存器变量
  • 一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量
  • 局部静态变量不能定义为寄存器变量,不能写成 register static int a,b,c,不能把变量a,b,c既存放在静态存储中又存放在寄存器中,二者只能居其一

用extrn声明外部变量

用static声明外部变量

关于变量的声明和定义

存储类别小结

内部函数和外部函数

内部函数

如果一个函数只能被文件中其他函数使用,成为内部函数用static声明

1
static int fun(int a, int b)

外部函数

如果在函数前添加了extern表示此函数是外部函数,可供其他文件调用

1
extrn int fun(int a, int b);