C语言(8) 函数
第五章 函数一段功能代码被称为函数1. 为了避免代码的重复。 复用性。 开发不用从头开始(库函数)。2. 模块化的思想 。 大问题分解成小问题逐个解决。设计函数 高内聚低耦合。 功能越单一越好 对外部依赖越少越好。函数在使用前需要先定义(告诉编译器有这个功能)再使用。 定义时包含(声明)函数的定义函数返回值 函数名(参数类表){函数体return x}参数列表 (数据类型 形式参数1,数据类型 形式参数2数据类型 形式参数3...)函数返回值 数据类型 函数在调用完毕后一般情况都是有结果值。 这个值就有数据的类型 。 如果函数的返回值 设计为void 那么函数调用(使用)后没有结果也就没有数据1. 如果设计函数的时候没有给定函数返回值的 默认是int 。如果确实没有什么需要返回的可以是void 。2. 如果函数的执行流程运行到return 是返回到函数的调用处。 return后的代码将不会被执行。3. 参数在传递的过程中需要保证参数的个数一致类型 匹配类型一致或可以隐式类型转换//函数的定义实现具体int add(){int a 20;int b 10;int ret ab;return ret; // 返回结果返回函数调用的地方。}int main(){int result add(); // 函数的使用,() 表示调用函数 int result ret; intresult 30;printf(result is %d\n,result);return 0;}函数的调用void fun1(){}void fun2(int arg1,int arg2) 形参形式参数{}函数后面的圆括号不可以省略。函数名(); // fun1();int a0, int b20 ;// 参数个数一致 数据类型也一致。函数名(arg1,arg2); // fun2(a,b); 实参实际参数//函数的定义 实现具体int add(){int a 20;int b 10;int ret ab;return ret; // 返回结果返回函数调用的地方。}int main(){int result add(); // 函数的使用,() 表示调用函数 int result ret; intresult 30;printf(result is %d\n,result);return 0;}主调函数在这个示例中main 是主调函数。调用功能的发起者。被调函数 在main中使用add的功能add 就是被动调用的函数。函数的声明在实际代码编写过程。没有办法保证 函数的定义一定在函数的调用前出现 (多文件编程)。编译器在编译的过程中就会出现未登记函数就会警告。为了避免这种情况 就要对函数进行声明int add(int a,int b) //声明int main(){....add(12,4*5); // 函数的调用但是函数的定义在后面定义的这时 会出现警告。....}int add(int a,int b){return ab;}int add(int a,int b) 函数的原型函数头。 包含函数名参数列表(参数的个数,每个参数的数据类型) 返回值的数据类型。变量的作用域和生命周期作用域变量定义后可以被访问的区域。局部作用域 局部变量变量作用域在离定义该变量最近的大括号内。当发生函数调用后作用域发生了变化在被调函数内部在主调函数内部定义的变量都不能使用。#include stdio.hint add(){return ab; // 不能访问到主调的 a,b 变量 。}int main(){int a 10; //局部作用域int b 20;//局部作用域int c add();return 0;}全局作用域 全局变量在所有的源文件( 同一个工程中 所有.c) , 在任意位置都可以直接使用的区域。变量的定义放在所有函数的外面。 就是全局变量int a 10; // 全局变量 整个工程中任意位置都可以被访问。int b 20;int add(){return ab;}int main(){int c add();printf(c is %d\n,c);return 0;}生命周期定义变量从开辟内存空间开始 到 变量的内存空间的回收 结束 的这个时间段被称为生命周期。局部变量的生命周期1. 函数内部定义的变量2. 函数的参数3. 函数内部定义的变量一定要给初值。如果没有给就是随机值在定义开始的地方申请内存。 执行到函数结束空间回收。全局变量的生命周期1.在所有函数之外定义的变量。2. 可以给初值。如果不给初值 由系统负责初始化为0 全局变量在a.out 正式运行起来前就要把空间开辟好在程序结束后空间释放 。全局变量有全局生命周期。在同一个作用域中标识符(变量名数组名函数名) 不能同名。如果一个作用域大一个作用域小出现同名标识符。 出现隐藏。变量的隐藏int a 10;int b 20;int add(){return ab;}int main(){int a 1;int b 3;int c add();int d ab; // 这个地方使用的是局部变量。全局变量被隐藏。printf(c is %d\n,c);return 0;}变量的存储类型存储类型 数据类型 变量名1. auto int a; 用的相对少2. register int b; 用的相对少3.extern int c;4.static int d;1. auto,自动存储类型 。 局部变量。 这个关键字 可以省略 。定义变量时内存空间自动开辟离开作用域时自动释放。内存的栈区(stack)。 函数内部定义的变量函数的参数。2. register寄存器 . 建议编译器把某个变量存储在cpu的寄存器中。register int c;3. extern外部变量。 声明。 导出目的是为了让其他的源文件可以使用1.c#include stdio.hextern int a; // 声明表示有这个变量在其他的.c 中extern int b;extern void fun();int main(){int c ab;printf(ab %d\n,c);fun();}2.cint a 10;// 定义开辟内存空间int b 20;void fun(){}gcc 1.c 2.c4.static 静态的可以修饰变量或函数。 用static 修改的变量内存的数据区static 修改局部变量如果局部变量前加 static 变量的生命周期是整个程序运行的周期但作用域不变。第一运行fun函数时 i 分配空间初始化。 如果不是第一次运行这个变量 就不会在分配空间和初始化。相当于 static int i 0这段没有 了。int fun(){static int i 0 ;// 全局生命周期i;return i;}int main(){int num 0;printf(input num);scanf(%d,num);int j 0 ;int count 0 ;for(j0;jnum;j){count fun();}// i 20; //errror 不能访问i。 i本身是存在但是没在i的作用域范围内。printf(count is %d\n,count);return 0;}static 修饰全局变量表示 这个变量只能在本模块(本源文件中 依然全局变量)中使用。其他的源文件 不可以使用。 static 的作用 限制作用域。static 修饰函数static 的作用 限制作用域。 避免函数重名5. a.out 运行起来后的内存分布图
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2608922.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!