函数
函数的分类
-
从定义的角度分类(即函数是谁实现的)
-
库函数(C库实现的)
-
自定义函数(程序员自己实现的函数)
-
系统调用(操作系统实现的函数)
-
从参数角度分类
-
有参数
-
函数的形参,可以是一个,或者多个,参数的类型随便完全取决于函数的功能
-
int fun(int a,float b,double c) {}
-
-
无参数
-
函数没有参数,在形参列表的位置写个void或者不写
-
int fun(void){} int fun(){}
-
-
-
从返回值角度分类
-
带返回值的函数
-
在定义函数的时候,必须带着返回值类型,在函数体里,必须有return
-
如果没有返回值类型,默认返回整数
-
char fun() // 定义了一个返回字符类型的函数 { char b = 'a'; return b; } fun() // 没有给返回类型,默认是整型 { return 1; }
-
注意: 在定义函数的时候,函数的返回值类型,到底是什么类型,取决于函数的功能.
-
-
没有返回值的函数
-
在定义的时候,函数名字前面加 void
void fun(参数) {}
-
return ; return 一个空格,或者不写return.
-
-
函数的定义
什么叫做函数的定义呢? 及函数的实现
-
函数的定义方法
返回值类型 函数名(形参列表) { // 函数体,函数的功能在函数体里实现 } 列如: int max(int x,int y) { int z; z = x > y ? x : y; return z; }
注:形参必修带类型,而且以逗号分隔
注:函数不能重名,就是不能重复定义。
函数的定义不能嵌套,即不能在一个函数体内定义另一个函数,所有函数都是平行的。
函数的声明
-
概念
- 对已经定义的函数,进行说明
- 函数的声明可以声明多次
-
为什么要声明
- 有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,因为编译器在编译C程序的时候,从上往下编译的。
-
声明的方法
-
什么时候需要声明
-
主函数和被调用的函数在同一个.c文件的时候
-
被调用函数在上,主调函数在下
-
这种情况下,不用声明 列
int max(int a,int b) {} int main() { max(1,2); }
-
-
直接声明
#include<stdio.h> void fun(); //直接声明 extern int max(int x,int y); // 外部的.c文件中的函数,通过 extern 直接声明 int main() { fun(); return 0; } void fun() { printf("Hello"); }
-
间接声明(两个文件)
-
将函数的声明放在头文件中, c.程序包含头文件即可
-
// 文件1 #include<stdio.h> // 库文件是尖括号,尖括号是不会在原文件目录里找的. #include"文件二.h" //自己写的,在一个路径里用" int main() { fun(); return 0; } void fun() { printf("Hello"); }
-
// 文件二.h 注意,需要将文件二放到头文件里 extern void fun(void); // extern 代表外部的意思
-
变量的存储类别
-
内存:物理内存、虚拟内存
- 物理内存:实实在在存在的存储设备
- 虚拟内存:操作系统虚拟出来的内存
- 操作系统会在物理内存和虚拟内存之间做映射。
- 在写应用程序的时候,咱看到的都是虚拟地址
-
在运行程序的时候,操作系统会将 虚拟内存进行分区。
分别是一下五种:
-
堆:在动态申请内存的时候,在堆里开辟内存
-
栈:主要存放局部变量。
-
静态全局区
-
未初始化的静态全局区
静态变量(定义变量的时候,前面加 static 修饰)或全局变量,没有初始化的,存在此区
-
初始化的静态全局区
全局变量、静态变量、赋过初值的,存放在此区。
-
-
代码区:存放咱们的程序代码。
-
文字常量区:存放常量的。
-
普通的全局变量
概念:
-
在函数外部定义的变量
-
int num = 100; //num 就是一个全局变量 int main() { return 0; }
作用范围:
- 普通全局变量的作用范围,是程序的所有地方.
- 只不过用之前需要声明. 声明方法 extern int num;
- 注意声明的时候,不要赋值.
生命周期:
- 程序运行的整个过程,一致存在,直到程序结束.
注意:定义普通的全局变量的时候,如果不赋初值,它的值默认为 0
静态的全局变量
- 概念:定义局部变量的时候,前面加 static 修饰
- 作用范围: 在它定义的函数或复合语句中有效。
- 生命周期:
- 第一次调用函数的时候,开辟空间赋值,函数结束后,不释放,以后再调用函数的时候,就不再为其开辟空间,也不再赋初值,用的是以前的那个变量。
#include<stdio.h>
void fun(void)
{
static int num = 3;
num++;
printf("num = %d\n", num);
}
int main()
{
fun();
fun();
fun();
return 0;
}
注意:
- 定义**普通局部**变量,如果不赋初值,它的值是随机的。
- 定义**静态局部变量,如果不赋初值,它的值是0**。
- 普通**全局变量,和静态全局变量如果不赋初值,它的值为0**.
变量存储类别扩展
- 在同一作用范围内,不允许变量重名。
- 作用范围不同的可以重名。
- 局部范围内,重名的全局变量不起作用。(就近原则)
外部函数
- 咱们定义的普通函数,都是外部函数
- 即函数可以在程序的任何一个文件中调用
内部函数
- 在定义函数的时候,返回值类型前面加 static 修饰.这样的函数被称为内部函数
- static 限定了函数的作用范围,在**定义的 .c 中有效**。
内部函数,和外部函数的区别:
- 外部函数,在所有地方都可以使用
- 内部函数, 只能在所定义的.c中的函数调用.