petard  

第 11 章 函数

写法:函数外可以声明定义语句,但不能随便写其他语句

11.3 主函数

主函数中可以调用其它函数,但其它函数不能反过来调用主函数,主函数也不能调用自己。

​ ——主函数调用 需要在命令行终端才可以执行

① 主函数返回值

C语言约定,主函数返回值0表示运行成功,如果返回其它非零整数,就表示运行失败。

一般主函数会在结尾写:return 0; // 表示运行成功

② 主函数参数(了解)

​ ——main主函数,由系统调用

参数一: 命令选项的数量
参数二: 由所有命令选项组成的数组
eg:
// 定义(声明)主函数, 由系统调用主函数
int main(int argc, char *args[])
{
    printf("Main Function: \n");
    printf("argc=%d \n", argc);
    // 遍历所有的选项
    for (int i = 0; i < argc; i ++)
    {
        printf("%s \n", args[i]);
    }

11.4 函数原型

作用:用于声明函数,可以将函数定义写在函数调用的后面

​ ——为了让主函数位置靠前一点,方便读代码

1. C语言中,【函数定义的语句】必须写在【函数调用语句】的前面,否则就用函数原型
2. 如果想把函数定义语句写在调用语句后面,可以在调用语句的前面使用【函数原型】提前声明函数
3. 函数原型需要指定函数的返回类型、函数名、参数类型,不需要设置函数体和参数名字。
	eg:int arr(int);

11.5 作用域

① 作用域的概念

1. 作用域用于确定在代码中某个标识符(如变量、标识符常量、数组等)的可见性和访问范围,它决定了在程序的哪些部分可以引用或访问该标识符。
2. 作用域可以分为全局作用域、局部作用域、块级作用域。
3. 同一个作用域中 不能声明同名 的标识符。

② 全局作用域

1. 在函数和代码块(分支、循环)以外声明的变量、标识符常量、数组等,具有全局作用域,在程序的任何位置都可以被访问
2. 全局的变量、标识符常量、数组,【如果没有初始化赋值】,可以被【自动初始化为0】
注:字符数组,将初始化为空字符 \0	——对应的也是0

③ 局部作用域

1. 在【函数内】定义的变量、标识符常量、数组等,具有局部作用域,作用范围仅限于该函数。
2. 局部的变量、标识符常量、数组,【如果没有初始化赋值】,会得到【垃圾值】,【不会被自动初始化】
	——对于浮点数未被初始化,会得到垃圾值。由于浮点数与整数的存储方式不同,就不能识别01010,所以是0.000 000
	
3. 当使用某个变量(标识符常量、数组等)的时候,先从所在的作用域中查找,如果没有再去上层作用域查找。
4. 函数的上层作用域由【定义函数的位置】决定,与调用函数的位置无关
   C语言标准不建议在函数内嵌套定义函数,函数的上层作用域就是全局。
   
5. 函数的形参也是局部变量,仅能在所在的函数内使用

④ 块级作用域

1. 在代码块【一个大括号 就是一个代码块】内(分支结构、循环结构、直接写大括号)定义的变量、标识符常量、数组等,具有块级作用域,作用范围仅限于所在的代码块。
2. 具有块级作用域的变量、常量、数组的特性与局部的变量、常量、数组一致,也可以称为局部变量、局部常量、局部数组
 // 循环结构
    for(int i=1; i < 3; i++)
    {
        int age = 100;  // 每次循环都会新建一个age,i还是i
        age ++;
        printf("i=%d,age=%d ",i, age);  // age都=101
    }

⑤ 作用域和内存

内存区域 存放数据
栈区(Stack) 局部变量、局部标识符常量、局部数组等
全局静态区 全局变量、全局标识符常量、全局数组等
堆区 ...
代码区 ...

变量(标识符常量、数组)的生命周期:

局部变量: 函数调用结束就销毁;函数再次调用重新创建。
全局变量: 程序执行结束销毁。

注:只有自行创建的值才需要手动自行销毁

11.6 static 和 extern 关键字

① 静态局部变量

static的作用:定义静态局部变量、静态全局变量、静态函数

eg: static int num;		// 没有初始化自动初始化为0
1. 存储在内存的【全局静态区】
2. 函数调用结束,静态局部变量不销毁,生命周期延长至[程序执行结束]
3. 没有初始化自动初始化为0

注:静态局部变量仍然是局部变量,作用域仍然是所在的函数!!!!

​ ——除了作用域范围没变,其他都和全局变量一致

② 静态全局变量

注: 多文件编译,主函数只能有一个

1. 某个源文件中使用 extern 关键字声明外部链接之后,可以使用其他源文件中定义的全局【变量、标识符常量、数组】
eg:extern int num;		//声明外部文件的标识符

extern的作用:声明外部链接,允许使用其他源文件中定义的全局变量

2. 静态(static)的【全局变量、标识符常量、数组】作用范围仅限于所在的源文件,其他源文件即使使用 extern 声明外部链接也无法使用。

③ 静态函数

同静态全局变量

总结

1. 函数概念
2. 函数基本语法
   ① 函数名,标识符
   ② 函数体,写在大括号中
   ③ 返回类型和返回值
   ④ 参数:形参和实参
3. 函数原型
4. 主函数
   返回值
   参数
5. 作用域
   全局作用域
   局部作用域
   块级作用域
   作用域和内存、生命周期
6. 静态变量 static
   静态局部变量
   静态全局变量 extern 
   静态函数

内存存储区域 生命周期 可作用范围 是否自动初始化
全局变量 全局静态区 整个程序 全局 是
局部变量 栈 函数调用完成销毁 所在的函数 否
静态局部变量 全局静态区 整个程序 所在的函数 是
posted on 2024-04-08 19:59  岌岌无名  阅读(263)  评论(0)    收藏  举报