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   岌岌无名  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
 
点击右上角即可分享
微信分享提示