C语言基础知识之函数

来源:互联网 发布:黑马程序员就业班教程 编辑:程序博客网 时间:2024/05/16 19:05

函数分类:

1.库函数;用户定义函数

2.有返回值函数;无返回值函数

3.无参函数;有参函数


C程序的执行总是从main函数开始,完成对其它函数的调用再返回到main函数中,最后由main函数结束整个程序。其他函数定义的位置任意。


函数定义的一般格式:

存储类型 数据类型 函数名(形参定义表)

{

   数据定义和生命语句序列;

   可执行语句序列;

}

例:求两数之间的最大值

/*函数定义

int max(int a,int b)   /*int 是函数类型,无返回值时类型是void,如果省略类型名,一律按整型处理。

{

     if(a>b)

              return a;

     else

              return b;

}

void main()

{

    int max(int a,int b);  /*函数说明,有些情况下可省略

    int x,y,z;

    printf("Please input two numbers:\n");

    scanf("%d%d",&x,&y);

    z=max(x,y);  /*函数调用

    printf("maxmum=%d",z);

}

省去主调函数对被调函数的函数说明的三种情况

1.被调函数的返回值值整型或者字符型时

2.被调函数的函数定义出现在主调函数之前时,在主调函数可以直接调用

3.在所有函数定义之前,子啊函数外预先说明了各个函数的类型,则在以后的主调函数中,可不再说明。

例:

char str(int a);

main()

{

}

char str(int a)

{

}

4.对库函数的调用不需要在做说明,但必须把该函数的头文件用include命令包含在源文件前部。


return语句的格式如下:

       return 表达式;

或   return(表达式);

或   [return;]

  无返回值函数的末尾可以有有一个不带表达式的return语句。

  当函数的返回值类型与函数定义时的类型不一样的时候,返回值自动转换成函数定义的类型。


在函数形参表中,允许不给出性参数组的长度,或者用一个变量来表示数组元素的个数

  例: void nzp(int a[])

   或   void nzp(int a[], int n)  /*n动态的该处数组长度

当形参为数组时,实参与形参实际上是同一数组,他们的值同时改变。数组名就是首地址,因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把是参数组的首地址赋予型参数组名。

 

内部函数与外部函数

 内部函数:在一个源文件中定义的函数只能被本院文件中的函数调用,而不能在同一程序中其它源文件的函数调用。

定义:

static 数据类型 函数名(形参定义表)

{

        函数体


外部函数:在一个源文件中的函数也可被其他源文件中的函数所调用。

定义:extern可省略,一般的函数都是外部函数

[extern] 数据类型 函数名(形参定义表)

{

        函数体

在调用外部函数时需要声明。


函数的递归调用:

例:用递归法计算n!

long ff(int n)

{

    long f;

     if(n<0)

             printf("n<0,input error");

     else if(n==0|| n==1)

            f=1;

     else

            f=ff(n-1)*n;

       return(f);

}


main()

{

    int n;

    long y;

    printf("input an inteager number:\n");

    scanf("%d",&n);

    y=ff(n);

    printf("%d!=%d",n,f);

}


变量:

1.局部变量的定义和说明可以不加区别,外部变量需要。(全局变量与外部变量是同一种,全局变是从它的作用域提出的,外部变量是从它的存储方式提出的)

外部变量只能定义一次:例 [extern]类型说明符 变量名1,2,…

[extern] int a, b;  /*extern可省略

2.在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。

3.变量的存储方式可分为两种,静态与动态。静态存储变量通常是在变量定义时就分定存储单元并一直保持不定,直至整个程序结束。动态存储变量是在程序执行过程中,使用它时才分配存储单元。静态局部变量在函数内定义,但生存期是整个程序,虽然离开了定义它的程序就不能使用,但是如果再次调用定义它的函数的时候,它又可继续使用并保留了上一次调用它的时候留下的值。静态全局变量则只能在同一源文件中才能使用,其他文件不能调用。


变量的存储类型:

动态存储方式: auto(自动变量,使用最广,可省略,不可作初始化赋值),register(寄存器变量,其他变量都存放在存储器中,这种变量存放在CPU的寄存器中,使用时不需要访问内存,直接从寄存器中读写,可提高效率)

静态存储方式:extern(外部变量),static(静态变量)