c 函数

作者: 去留无意hmy | 来源:发表于2017-07-11 20:06 被阅读55次

函数

c语言程序可由一个主函数和若干其它函数构成,每个函数实现一个特定的功能。主函数调用其他函数,其它函数也可以互相调用。同一个函数可以被一个或者多个函数调用多次。

  • 函数定义

c语言要求,在程序中用到的所有函数,必须“先定义,后使用”。例如想用max求两个数的最大值。必须先按规范对它进行定义,指定他的名字、函数返回类型、函数实现的功能以及参数的个数和类型,将这些信息通知给编译系统。这样程序执行max函数的时,编译系统就会按照定义式所指定的功能去执行。如果事先不定义,编译系统是无从知晓max是什么,要实现什么功能的。

  • 无参函数

类型名 函数名(形式参数列表)
{
函数体
}

void printstar ()
{
    
}

函数没有返回值所以定义为void

  • 有参函数

类型名 函数名(形式参数列表)
{
函数体
}

我们通过案例来理解,编写程序9-2.求出两个数的最大值。程序如下:

Alt text

运算结果:

20

说明

(1)在上述函数调用过程中,主调函数和被调函数之间存在数据传递的关系。在定义函数的时候函数名后面括号中的变量名称为“形式参数”(简称“形参”)(上例中为x和y),在调用语句c=max(a,b);中,a和b称为“实际参数”(简称“实参”)。

(2)函数的调用过程:

  • 在定义函数中指定的形参,在未出现函数调用时,他们并不占内存中的存储单元。在发生函数调用时,函数max的形参被临时分配内存单元。
  • 将实参对应的值传递给形参。9-2例题中,实参的值a为10,b为20.把10和20传递给相应的形参x和y,这是形参x就得到了10,形参y得到值20.
  • 在执行max函数期间,由于形参已经有值,就可以利用形参进行有关运算了
  • 通过return语句将运算得到的z的值带回主调函数。应当注意返回值的类型和函数类型一致。如max函数为int型,返回值是变量z,也是int类型,两者一致。
  • 函数的嵌套调用

c语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能定义另一个函数,也就是不能嵌套定义,但是可以嵌套调用函数,也就是说,在调用一个函数的过程中,又可以调用另一个函数。
例如:

int fun(int a)
{
    int b,c;
    c=fun(b);   //在执行的过程中又调用了函数fun
    return(2*c);
}

在调用函数fun的过程中,又调用fun函数,这是直接调用本函数,见下图:

img

这种调用都是无终止的调用,显然程序中不可能出现这种状况,而是应该出现有限次数的、有终止的递归调用,这可以用if语句来控制。

  • 递归调用举例(计算阶乘)
#include <stdio.h>

int Recursionchart(int n);
int main()
{
    int n,fn;
    printf("n=");
    scanf("%d",&n);
    if(n<0)
    {
        printf("请重新输入:n=");
        scanf("%d",&n); 
    }
    else
    {
        fn=Recursionchart(n);
    }
    printf("f(%d)=%d",n,fn);
    return 0;
 } 
int Recursionchart(int n)
{
    int fn;
    if(n==0||n==1)
    {
        fn=1;
    }
    else
    fn=Recursionchart(n-1)*n;
    
    return fn;
}

数组与函数

  • 数组元素作为函数实参

数组元素可以作为函数实参,不能作为函数形参。因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。

  • 程序举例

输入10个数,要求输出其中值最大的元素和该数是第几个数。

解题思路:可以定义一个长度为10的数组。设计一个函数max,用来求两个数中的大者。在主函数中定义一个变量m,m的初值为a[0],每次调用max函数后的返回值存放在m中。用打擂台算法,将数组元素a[1]到a[9]与m比较,最后的到的m就是最大值。

编写程序:

#include&lt;stdio.h&gt;
int main()
{
    int max(int x,int y);
    int a[10],m,n,i;
    printf(&#34;please enter 10 integer number:&#34;);
    for(i=0;i&lt;10;i++)
       scanf(&#34;%d&#34;,&amp;a[i]);
    printf(&#34;\n&#34;);
    
    for(i=1,m=a[0],n=0;i&lt;10;i++)   
    {
        if(max(m,a[i])&gt;m)          //若max函数返回值大于m
        {
            m=max(m,a[i]);        //max函数的返回值取代m
            n=i;                  //把数组元素的序号记下来,放到n中
        }
    }
     
    printf(&#34;the largest number is %d\n it is the %dth number \n&#34;,m,n+1);
}

int max(int x,int y)
{
    return(x&gt;y?x:y);
}
  • 数组名作为函数参数

除了可以用数组元素作为函数的参数外,还可以用数组名做函数参数(包括实参和形参)。应当注意的是:用数组元素作为实参时,向形参变量传递的是数组所对应数组元素的值,而用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址,下一节指针大家会更加深入的理解该内容。

  • 程序举例

编写程序9-6 有一个一位数组score,内放10个学生成绩,求平均成绩。

解题思路:用一个函数average来求平均成绩,不用数组元素作为函数实参,而是用数组名作为函数的实参,形参也用数组名,在average函数中引用各数组的元素,求平均成绩并返回main函数。

编写程序:

#include&lt;stdio.h&gt;
int main()
{
    float average(float array[10]);
    float score[10],aver;
    int i;
    printf(&#34;please enter 10 scores:&#34;);
    for(i=0;i&lt;10;i++)
       scanf(&#34;%f&#34;,&amp;score[i]);
    printf(&#34;\n&#34;);
    
    aver=average(score);   //注意这里调用函数时,向形参传递的是数组首元素的地址
    printf(&#34;average score is %5.2f\n &#34;,aver);
    return 0;
}

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

注意:用数组名作为函数参数,应该在主调函数和被调用函数分别定义数组,例如array是形参的数组名,score是实参数组名,分别在其所在函数中定义。

参考文献

[1]实验楼 模块化程序设计(https://www.shiyanlou.com/courses/57/labs/367/document)

相关文章

  • C/C++ 函数地址

    C 函数 C 语言中没有类的概念,只有普通的函数。 控制台输出: C++ 函数 C++ 函数有如下几种: 1)普通...

  • 是否还需要在源文件中添加“extern C”?

    c++调用c语言的函数时我们一般在c语言函数声明处用extern "C"包c函数。例如: extern "C"的主...

  • 一些函数

    cmp函数 C++ sort cmp函数 - lzz的博客 - CSDN博客 浅谈C/C++排序函数中cmp()比...

  • 文件I/O总结

    1.1 C标准函数与系统函数 C标准是工作在操作系统之上的。比如要执行C标准函数printf函数,printf会调...

  • iOS开发 -- C语言基础3(函数)

    iOS开发 -- C语言基础3(函数) 什么是函数 一、函数的分类 C语言中的函数就是面向对象中的"方法",C语言...

  • C函数和C++函数相互调用的问题

    C函数和C++函数相互调用的问题

  • C/C++ 取整函数ceil(),floor()2019-10-

    转自: C/C++ 取整函数ceil(),floor() C/C++ 取整函数ceil(),floor() #in...

  • extern "C"

    C++函数调用C函数 先来看个例子吧,建立一个新的工程,包含三个文件c函数头文件, cExample.h c函数源...

  • windows逆向3

    VC 程序内存和编译的一些特征C++ 构造函数C++ 成员函数C++ 析构函数C++ 全局对象的构造C++ 全局对...

  • 第四周

    函数 def sb(a,b): 定义函数 a, b 是形参 sb(c,d) 调用sb 函数 c,d是实参 函数局部...

网友评论

      本文标题:c 函数

      本文链接:https://www.haomeiwen.com/subject/sqgmhxtx.html