第 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
静态函数
内存存储区域 | 生命周期 | 可作用范围 | 是否自动初始化 | |
---|---|---|---|---|
全局变量 | 全局静态区 | 整个程序 | 全局 | 是 |
局部变量 | 栈 | 函数调用完成销毁 | 所在的函数 | 否 |
静态局部变量 | 全局静态区 | 整个程序 | 所在的函数 | 是 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)