Dominating---C语言自学学习笔记之函数

一、函数的概述

C语言的函数是具有一定功能的代码的集合
需注意的是:
    (1)C源程序是由函数组成,函数由函数首部和函数体组成,函数体包括声明部分和执行部分。在这里有的二级C题目会出现“C语言程序是由过程和函数组成的”这样的选项,很明显是错误的,C语言程序无过程的概念。
    (2)C语言程序可以由多个源程序组成,其中一个源程序文件包含main函数,其他函数可以写在另外的源程序文件中,作为一个单独文件,并可以单独编译。
    (3)C程序执行总是从main函数开始执行,完成对其他函数调用后再返回到main函数,最后由main函数结束整个程序。
    (4)main函数可以放在任意位置,且可以调用其他函数,但其他函数不可调用main函数。一个C程序有且只有一个main函数。
    (5)在一个函数体内,不能再定义另外的函数,即不可以嵌套定义。

二、函数的定义

基本格式:
类型名 函数名(数据类型 形参1,······){函数体}
说明:
    (1)类型名。定义函数的返回值类型,可以是任何的数据类型,如:int、char等,也可以不写(默认为int型),也可没有返回值(为void型)。
    (2)函数名。合法标识符,一般做到见名知意。
    (3)形参列表。用逗号分开,需指明数据类型,如果没有参数,可设置为void或者不写。
    (4)函数体。一般包括说明部分和执行部分,也可以不写,为空函数,无具体功能,但对程序扩展很有用。

三、函数的返回值

return语句一般形式:return 表达式或return(表达式);
说明:
    (1)return后的表达式可以是常量、变量、表达式,也可以是空。
    (2)在函数体中允许有多个return语句,但每次只能执行一个return语句。
    (3)没有return语句的函数在执行到最后一条语句后自动返回到调用处。
    (4)函数返回性类型取决于定义函数时函数名称前的类型。

四、函数参数

1、形参与实参的区别:
    (1)形参出现在函数定义中,实参出现在主调函数中(调用函数时函数名后面的括号中的参数)。
    (2)形参在本函数体内都能使用,离开函数则无效;实参在主调函数中使用,离开则无效(在进行函数调用时,函数必须有确定的值)。
    (3)实参向形参单向传递数值,不能反过来。形参和实参在数据、类型、顺序上要一致。在函数调用过程中,形参的变化不能引起实参的变化。
举例:int fun(int a,int b){}//函数定义,形参
2、参数传递
    (1)在传递数值时,形参和实参分别占据不同的存储单元。形参变量只有在被调用时才分配内存单元,调用结束后,即刻释放内存单元;在传递地址时,实参和形参共占同一个存储单元。         
    (2)“传值”与“传址”的区别:传值时,形参的变化不会引起实参的变化;传址时,形参的变化有可能引起实参的变化。

五、函数调用

1、函数调用
(1)一般形式:
函数名(实参列表);
实参可以是参数、变量、或其他构造类型数据及表达式,也可不写。
(2)调用方式:
z=max(x,y);//函数表达式
printf("%d\n",a);//数语句
printf("%d",max(x,y));//作为另一个函数调用的实参
(3)嵌套调用
如:d=f(f(a,b),f(a,c));
(4)递归调用
可分为直接递归调用和间接递归调用
递归必须满足的条件如下:
    .可以把一个问题转化为新问题
    .递归调用必须有一个明确的结束条件
2、函数声明
  函数要“先定义后调用”或者“先声明再调用后定义”。函数的声明一定要有函数名、函数返回值类型、函数参数类型,但不一定要有形参名。
一般形式:
    类型名 被调函数名(形参列表);
或者
    类型名 被调函数名(数据类型,······);
注意:末尾“;”不能省略。
如:int fun(int a,intb);或int fun(int,int);

六、变量的作用域和存储类别

1、全局变量
    在函数外部定义的变量,称为全局变量,也称为外部变量。全局变量可被本文件的其他函数所共用。
2、局部变量
    在函数内部或符合语句内部定义的变量,它只在本函数范围内有效,即只能在函数内部使用它们,在函数外不能使用,此为局部变量,又称为内部变量,其作用域由具体定义位置和extern说明来决定(extern可对全局变量加以说明,扩展其作用域,在整个程序中有效,故会一直占用内存单元)。函数的形参也属于局部变量。
3、变量的存储类别(static变量、auto变量、register变量)
(1)静态变量(static)
    .在编译时分配存储空间,所占存储单元直到程序结束时才释放,它的值在程序运行过程中一直存在,且变量的初始化只进行一次。      
    .static说明符可以修饰全局变量和局部变量(auto和register不可以定义全局变量),但当它说明变量后,只要这个变量还在程序中存在,那么不管用到还是没有用到,它都会占用内存单元。
(2)自动变量(auto)
    .自动变量的存储空间是当程序执行到定义它的函数或语句块时才分配,当函数执行结束后自动释放,变量的值也就不存在了。
    .局部变量的默认存储类别为auto,可省略,不可定义全局变量。
(3)寄存器变量(register)
    编译程序将变量的值保存在CPU的寄存器中,不占用内存单元。

七、数组与函数

(1)数组用作函数参数有两种形式:
    .把数组元素(下标变量)作为实参使用
    .把数组名作为函数的形参和实参使用
(2)数组元素用作函数的实参与普通变量并无区别,所进行的是值传递,形参变量和实参变量占据由编译系统分配的两个不同的内存单元。
(3)数组名作为函数参数时,所进行的是地址传递,相当于把实参数组的首地址赋予了形参数组名或指针名。此时,形参数组与实参数组为同一数组,共同拥有一段内存单元。
    数组名作为实参时,对应形参有三种表现形式:*a、a[]、a[N]。

八、库函数

    函数可分为库函数和用户自定义函数。库函数由C系统提供,用户不可更改,用户无须定义,在调用C语言标准库函数时要包含include命令,include命令行以#开头。不作详细介绍!

猜你喜欢

转载自blog.csdn.net/qq_36974603/article/details/78677197