
1.函数的定义函数返回值 函数名(参数类表) { 函数体 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; int result 30; printf(result is %d\n,result); return 0; }2.函数的调用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; int result 30; printf(result is %d\n,result); return 0; } 主调函数在这个示例中main是主调函数即调用功能的发起者。 被调函数在main中使用add的功能add就是被动调用的函数。3.函数的声明在实际代码编写过程。没有办法保证函数的定义一定在函数的调用前出现 (多文件编程)。编译器在编译的过程中就会出现未登记函数就会警告。为了避免这种情况就要对函数进行声明。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)即函数的原型。包含函数名参数列表(参数的个数,每个参数的数据 类型)返回值的数据类型。4.变量的作用域和生命周期4.1作用域变量在程序中可以被访问的范围局部变量变量作用域在离定义该变量最近的大括号内仅在声明它的函数可用离开该范围后回收不可用不同函数中的同名局部变量各自独立#include stdio.h int add() { return ab; // 不能访问到主调的 a,b 变量 。 } int main() { int a 10; //局部作用域 int b 20;//局部作用域 int c add(); return 0; }全局变量定义在所有函数外部之前变量作用域在整个工程代码中任意位置都可以使用全局变量所有函数均可访问但可能引发命名冲突int a 10; // 全局变量 整个工程中任意位置都可以被访问。 int b 20; int add() { return ab; } int main() { int c add(); printf(c is %d\n,c); return 0; }4.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; }4.3变量的存储类型存储类型 数据类型 变量名 1.auto int a; 用的相对少 2.register int b; 用的相对少 3.extern int c; 4.static int d;1.auto默认自动存储类型且为局部变量。 这个关键字可以省略 。定义变量时内存空间自动开辟离开作用域时自动释放。2.register寄存器存储在函数内部定义默认初始值为随机值将变量存放在CPU内部的寄存器中如果寄存器存放等价于auto类型3.extern声明一个变量是外部存放的全局作用默认初始值为0声明其他文件定义的全局变量1.c #include stdio.h extern int a; // 声明表示有这个变量在其他的.c 中 extern int b; extern void fun(); int main() { int c ab; printf(ab %d\n,c); fun(); } 2.c int a 10;// 定义开辟内存空间 int b 20; void fun() { } gcc 1.c 2.c4.static静态存储全局作用默认初始值为0。可以修饰变量或函数将变量存放在静态区中保持变量值跨函数调用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的作用限制作用域避免函数重名。4.4a.out 运行起来后的内存分布图栈区存放局部变量auto栈区空间上限默认为8M栈区是操作系统管理区域频繁被申请释放所以未经初始化值为随机值代码执行到变量定义时开辟栈空间代码执行超过变量作用域回收栈空间数据区存放全局变量和静态变量未经初始化时会初始化为0值程序编译时分配空间程序结束时回收空间