C程序的组成单位 您所在的位置:网站首页 函数是c语言程序的基本组成部分 C程序的组成单位

C程序的组成单位

2023-11-23 23:01| 来源: 网络整理| 查看: 265

函数概述

在解决大问题时,我们通常会把一个大问题分解成多个小问题,然后对小问题逐一求解。 如果将源文件比作大问题,那么源文件里面的函数就是小问题,只要解决了函数,那么大问题也就解决了。 这里的函数和我们在中学课本上认识的函数有相似的地方,当然也有不同的地方。 传统意义上的函数: ①一个x值对应一个y值 ②输入一个x值给函数 ③函数利用这个x进行计算 ④把算的的结果赋值给y 而C语言中的函数可以这样: ①没有一一对应这个规则 ②可以输入多个值给函数,也可以一个也不输入 ③可以对输入给函数的(如输入x)值进行操作,也可不操作 ④最后把计算的结果返回(类似于把结果赋给y),也可以不返回数值 注:这里的函数已经不单单是数学课本上有表达式的那种函数了。

函数定义

定义格式:

返回值类型 函数名称(形式参数列表)//输入部分 { 声明语句部分; 可行执行语句部分; //计算部分,不仅仅进行数字运算 return 表达式; //返回部分 }

返回值类型:也叫函数类型,这个函数调用结果后返回的类型。 函数名称:函数的标识,遵循标识符命名规则。 形式参数列表:用逗号分隔,必须声明类型如

(int a,int b,int c)

return:函数执行到return时,整个函数停止运行。类似于break可以停止循环。可以有如下形式

return 1; //返回一个值为1的整型,函数调用结束 return 1.0; //返回一个值为1的浮点类型,函数调用结束 return; //啥也不返回,函数调用结束

注:函数的返回值类型最好和return后面跟的类型一致,如果不一致,则进行隐式强制转换,如果转换不成功,则报错。 函数不能镶嵌定义,即不能在一个函数里面定义另一个函数。

函数声明

须知:C语言编译器按从头到尾的顺序编译源程序。 编译过程对已声明的标识符作标记,当编译一条指令时,要检查其标识符是否作了标记,如果没有标记则报错。

函数声明:当编译器在编译阶段遇到函数声明时,会将函数声明的标识符标记,下次就遇见该标识符就不会报错了(注意:编译器是对声明的标识符标记)

void fun(void); //函数声明 void fun(void) //函数定义 { printf("人生苦短,我学C!"); return; }

注:省略函数声明也可以,函数定义也可以当声明用,省略的时候请参考编译器的编译顺序(本人不建议省略)。

头文件使用

开发大型项目时,使用到的函数数量可能是成千上万的,让每个程序员熟悉函数并正确声明函数是非常困难的,因此建议定义一类扩展名为.h的头文件存放函数声明,此外,该文件也可以包括类型定义,全局变量声明,符号常量定义等。

#include"头文件名" //用于自定义头文件 //编译器优先在当前目录查找此文件, //然后再去系统目录里找 #include //编译器优先在系统目录中查找此文件 库函数声明

库函数是指由软件开发组织或个人开发,包含特定功能函数的函数集。使用库函数的方便之处在于,不需要知道函数的具体定义,就可以直接调用函数。

库函数声明:使用#include包含相应的头文件即可,因为头文件里面有库函数声明。 如:

#include //声明标准输入输入库 int main() { printf("读码上万行,下键如有神"); //printf的头文件在stdio.h里 return 0; }

头文件的使用

注: ①在编译阶段,通过#include包含同文件,能将头文件插入到当前源程序中。 ②在链接阶段,自定义的函数目标代码与库函数的目标代码合并,所以函数名不能重复,如果自定义函数只有声明而没有定义就会出现错误。

函数调用

前提是已声明,并且有定义的函数。 调用格式: 函数名 (参数列表) 如调用printf函数 printf("%d",19991215); printf是函数名,"%d",19991215是参数

主调函数:调用函数的函数。 被调函数:被调用的函数。 函数调用示意图:

在这里插入图片描述 注:除主函数外,其余函数地位相同可以互相调用,但是不能调用主函数。 特别的函数内部调用自己称为递归调用(主函数也可以调用主函数)

函数参数传递

参数有三种情况: ①固定参数 如 (int a,int b) ②可变参数 如函数printf和scanf ③无参数 如(void)

#include void fun(int a,int b); //声明中的a,b均为占位符 void fun(int a,int b) //函数定义 { //这里的a,b均为变量,称为形式参数,简称形参 printf("a=%d,b=%d",a,b); return; } int main() { int x=12; int y=15; fun(x,y); //函数调用,发生参数传递 //x,y虽然为变量,但是发生参数传递时,是将x,y的数值分别复制 //给变量a,b。称函数调用时函数fun参数列表中的参数为实际参数 //简称实参。 //实际参数是数值,形式参数是变量。 return; } 参数传递机制 值复制传递机制

从主调函数到被调函数,参数是从实参赋值给形参的单项过程,此参数传递一般称为“值复制“ 函数之间的参数传递过程为: ①计算实参值。 ②系统为形参分配存储空间,将实参值复制给形参。 ③被调函数依据形参获得的输入数据及函数定义完成计算。 ④函数调用结束,被调函数返回主调函数,系统释放被调用函数运行时所分配的空间,即函数内部声明的变量(包括函数参数)将全部消失。 建议熟记这个过程。 注:每个函数内声明的变量,数组或其他类型独占一个数据区,所以每个函数内的可以出现相同名称的变量。

地址复制传递机制

地址复制机制是一种特殊的值复制传递机制,将变量或数组,或其他类型的地址传给被调函数,使主调函数和被调函数共同访问同一片数据区。 传递过程: ①主调函数首先确定要复制的内存首地址(如数组名) ②主调函数调用被调函数,将地址通过值复制方式传递给被调函数的形参 ③被调函数通过地址访问操作(如下标运算),访问此内存空间对应的变量或数组元素 ④被调函数结束,返回主调函数



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有