目录

  • 1 课程导论
    • 1.1 课程整体介绍
      • 1.1.1 所有专业人才培养方案
    • 1.2 为什么学(WHY)
      • 1.2.1 行业需求分析
      • 1.2.2 计算机等级考试大纲
      • 1.2.3 软件水平考试大纲
    • 1.3 课程性质及作用(WHAT&WHERE)
    • 1.4 学什么(WHAT)
      • 1.4.1 程序设计基础_知识图谱
    • 1.5 如何学(HOW)
      • 1.5.1 课程考核
      • 1.5.2 课程学习资源
      • 1.5.3 程序设计基础A_考试大纲
      • 1.5.4 蓝桥杯相关备赛资料
      • 1.5.5 程序设计基础学习资料
  • 2 程序与程序设计语言
    • 2.1 课前挑战
      • 2.1.1 扩展知识学习
        • 2.1.1.1 计算机发展史
        • 2.1.1.2 计算机系统构成
        • 2.1.1.3 计算机应用
        • 2.1.1.4 信息编码与存储
    • 2.2 课程导入(WHERE)
    • 2.3 要点解析(WHAT)
      • 2.3.1 什么是程序
      • 2.3.2 C程序基本结构如何
      • 2.3.3 什么是计算机指令
        • 2.3.3.1 指令与程序
      • 2.3.4 什么是计算机语言
        • 2.3.4.1 程序设计语言
        • 2.3.4.2 C语言概述
    • 2.4 项目实战(HOW)--60秒关机
    • 2.5 项目拓展(HOW)--查看本机IP地址
    • 2.6 实验(训)项目一:C语言编程基础
      • 2.6.1 学长说--第一个程序
      • 2.6.2 拓展练习代码截图
    • 2.7 章节通关测试--程序与程序设计语言
  • 3 问题求解与算法设计
    • 3.1 课前挑战
      • 3.1.1 问题求解与算法设计
      • 3.1.2 程序设计思想
    • 3.2 课程导入(WHERE)
    • 3.3 要点解析(WHAT)
      • 3.3.1 什么是算法
      • 3.3.2 算法有什么特征
      • 3.3.3 算法的描述方式
    • 3.4 项目实战(HOW)--流程图绘制
    • 3.5 项目拓展(HOW)--目标检测算法流程表述
    • 3.6 学长说--矩形面积计算
    • 3.7 章节通关测试-- 问题求解与算法设计
  • 4 标识符;数据类型
    • 4.1 课前挑战
    • 4.2 课程导入(WHERE)
    • 4.3 要点解析(WHAT)
      • 4.3.1 标识符的命名规则
      • 4.3.2 数据类型
    • 4.4 项目实战(HOW)--学习强国平台数据类型分析
    • 4.5 项目拓展(HOW)--GDP;北斗风电场数据类型分析
    • 4.6 学长说--查看数据类型内存空间
    • 4.7 章节通关测试--标识符与数据类型
  • 5 常量、变量
    • 5.1 课前挑战
      • 5.1.1 相关知识提前学--常量
      • 5.1.2 相关知识提前学--变量
    • 5.2 课程导入(WHERE)
    • 5.3 要点解析(WHAT)
      • 5.3.1 什么是变量、什么是常量
      • 5.3.2 如何声明变量及常量
    • 5.4 项目实战(HOW)--报文解密
    • 5.5 项目拓展(HOW)--疫情可视化
    • 5.6 章节通关测试--常量与变量
  • 6 运算符与表达式
    • 6.1 课前挑战
      • 6.1.1 相关知识提前学--运 算 符
      • 6.1.2 相关知识提前学--赋值运算符与赋值表达式
      • 6.1.3 相关知识提前学--自增、自减
      • 6.1.4 相关知识提前学--类型转换
      • 6.1.5 相关知识提前学--位运算
    • 6.2 课程导入(WHERE)
    • 6.3 要点解析(WHAT)
      • 6.3.1 赋值运算符及表达式
      • 6.3.2 算术运算符及表达式
      • 6.3.3 数据类型的转换
    • 6.4 项目实战(HOW)--报文解密
    • 6.5 项目拓展1·(HOW)--报文解密
      • 6.5.1 项目拓展--北斗卫星导航定位原理
    • 6.6 学长说--报文解密
    • 6.7 章节通关测试--运算符与表达式
  • 7 数据输入、输出
    • 7.1 输入、输出函数
      • 7.1.1 课前挑战
      • 7.1.2 课程导入(WHERE)
      • 7.1.3 要点解析(WHAT)
        • 7.1.3.1 输出函数printf
        • 7.1.3.2 输入函数scanf
      • 7.1.4 项目实战(HOW)--工资核算
        • 7.1.4.1 学长说--工资核算
      • 7.1.5 项目拓展(HOW)--北斗卫星导航定位原理
      • 7.1.6 学长说--报文解密2
      • 7.1.7 章节通关测试--输入、输出
    • 7.2 字符、字符串的输入输出函数
      • 7.2.1 课前挑战
      • 7.2.2 课程导入(WHERE)
      • 7.2.3 要点解析(WHAT)
        • 7.2.3.1 字符数据的输入、输出
        • 7.2.3.2 字符串数据的输入、输出
      • 7.2.4 项目实战(HOW)--学习强国登录模块1
      • 7.2.5 项目拓展(HOW)--学习强国用户注册1
      • 7.2.6 章节通关测试--字符、字符串的输入输出
  • 8 顺序结构程序设计
    • 8.1 课前挑战
    • 8.2 课程导入(WHERE)
    • 8.3 要点解析(WHAT)
      • 8.3.1 顺序结构
      • 8.3.2 基本语句
    • 8.4 项目实战(HOW)--工资核算
    • 8.5 项目拓展(HOW)--报文解密实例
    • 8.6 实验(训)项目二:结构化程序设计1--顺序结构
    • 8.7 第一阶段测试:C语言编程基础
  • 9 选择结构程序设计
    • 9.1 关系运算符及逻辑运算符及运算符优先级
      • 9.1.1 课前挑战
      • 9.1.2 课程导入(WHERE)
      • 9.1.3 要点解析(WHAT)
        • 9.1.3.1 关系运算符与关系表达式
        • 9.1.3.2 逻辑运算符与逻辑表达式
        • 9.1.3.3 运算符优先级
      • 9.1.4 项目实战(HOW)--学习强国登录模块1
      • 9.1.5 项目拓展(HOW)--打字练习
      • 9.1.6 选择结构上机实训
      • 9.1.7 章节通关测试--关系运算符及逻辑运算符及运算符优先级
    • 9.2 单分支及双分支结构
      • 9.2.1 课前挑战
        • 9.2.1.1 条件运算符与条件表达式
      • 9.2.2 课程导入(WHERE)
      • 9.2.3 要点解析(WHAT)
      • 9.2.4 项目实战(HOW)--快捷支付程序模拟
      • 9.2.5 项目拓展(HOW)--学习强国登录2;自动驾驶汽车
      • 9.2.6 学长说--软件设计师证书生成程序模拟
      • 9.2.7 学长说--银行卡账户余额支付
      • 9.2.8 章节通关测试--单分支及双分支结构
    • 9.3 多分支结构
      • 9.3.1 课前挑战
      • 9.3.2 课程导入(WHERE)
      • 9.3.3 要点解析(WHAT)
        • 9.3.3.1 if else嵌套
        • 9.3.3.2 switch语句
      • 9.3.4 项目实战(HOW)--普通话等级鉴定
      • 9.3.5 项目拓展(HOW)--了不起我的国
      • 9.3.6 实验(训)项目二:结构化程序设计2--选择结构
      • 9.3.7 学长说--天气预报实现演示1 if else嵌套
      • 9.3.8 学长说--天气预报实现演示;switch语句
      • 9.3.9 学长说--switch恐龙世界
      • 9.3.10 学长说--普通话等级鉴定1--if;else嵌套
      • 9.3.11 学长说--普通话等级鉴定2--switch
      • 9.3.12 章节通关测试--多分支结构
  • 10 循环结构程序设计
    • 10.1 自增/自减运算符与自增/自减表达式
    • 10.2 while&do-while循环
      • 10.2.1 课前挑战
      • 10.2.2 课程导入(WHERE)
      • 10.2.3 要点解析(WHAT)
      • 10.2.4 项目实战(HOW)--音乐喷泉程序模拟
      • 10.2.5 项目拓展(HOW)--KEEP运动迹模拟
      • 10.2.6 学长说--音乐喷泉实例
      • 10.2.7 章节通关测试--while&do-while循环
    • 10.3 for循环
      • 10.3.1 课前挑战
      • 10.3.2 课程导入(WHERE)
      • 10.3.3 要点解析(WHAT)
      • 10.3.4 项目实战(HOW)
      • 10.3.5 项目拓展(HOW)--输出矩阵数据
      • 10.3.6 学长说--慈善募捐
      • 10.3.7 学长说--100~200之间的不能被3整除的数
      • 10.3.8 章节通关测试--for循环
    • 10.4 for循环嵌套
      • 10.4.1 课前挑战
      • 10.4.2 课程导入(WHERE)
      • 10.4.3 要点解析(WHAT)
      • 10.4.4 项目实战(HOW)--慈善募捐
      • 10.4.5 项目拓展(HOW)--矩阵操作
      • 10.4.6 实验(训)项目二:结构化程序设计3--循环结构
      • 10.4.7 学长说--输出以下4×5的矩阵
      • 10.4.8 学长说--打印图形1
      • 10.4.9 学长说--打印图形2
      • 10.4.10 学长说--输出100-200间的素数
      • 10.4.11 学长说--我爱你中国升级版-for循环嵌套
      • 10.4.12 第二阶段测试:结构化程序设计
  • 11 数组
    • 11.1 一维数组
      • 11.1.1 课前挑战
      • 11.1.2 课程导入(WHERE)
      • 11.1.3 要点解析(WHAT)
      • 11.1.4 项目实战(HOW)--成绩统计1
      • 11.1.5 项目拓展(HOW)--斐波拉契数列
      • 11.1.6 学长说--成绩统计1
      • 11.1.7 学长说--斐波拉契数列问题
      • 11.1.8 章节通关测试--一维数组
    • 11.2 二维数组
      • 11.2.1 课前挑战
      • 11.2.2 课程导入(WHERE)
      • 11.2.3 要点解析(WHAT)
      • 11.2.4 项目实战(HOW)-- 成绩统计1
      • 11.2.5 项目拓展(HOW)--图像卷积模拟
      • 11.2.6 学长说--成绩统计二
      • 11.2.7 章节通关测试--二维数组
    • 11.3 字符数组及字符串函数
      • 11.3.1 课前挑战
      • 11.3.2 课程导入(WHERE)
      • 11.3.3 要点解析(WHAT)
      • 11.3.4 项目实战(HOW)--学习强国登录
      • 11.3.5 项目拓展(HOW)
      • 11.3.6 学长说--学习强国的登录模块
      • 11.3.7 第三阶段测试:数组
  • 12 模块化程序设计--函数
    • 12.1 函数的定义、参数、声明
      • 12.1.1 课前挑战
      • 12.1.2 课程导入(WHERE)
      • 12.1.3 要点解析(WHAT)
      • 12.1.4 项目实战(HOW)
      • 12.1.5 项目拓展(HOW)--学习强国用户模块1
      • 12.1.6 学长说--四则混合运算
      • 12.1.7 章节通关测试--函数的定义、参数、声明
    • 12.2 函数的调用、常用库函数调用
      • 12.2.1 课程导入(WHERE)
      • 12.2.2 课前挑战
      • 12.2.3 要点解析(WHAT)
      • 12.2.4 项目实战(HOW)--自助点餐系统
      • 12.2.5 项目拓展(HOW)--学习强国用户模块2
      • 12.2.6 章节通关测试--函数的调用、常用库函数调用
      • 12.2.7 学长说--求自然数的平方根(库函数应用)
      • 12.2.8 学长说--大小写字母转化
      • 12.2.9 学长说--产生随机数序列
    • 12.3 函数的嵌套、递归调用
      • 12.3.1 课前挑战
      • 12.3.2 课程导入(WHERE)
      • 12.3.3 要点解析(WHAT)
      • 12.3.4 项目实战(HOW)--斐波拉契数列问题
      • 12.3.5 项目拓展(HOW)--学生年龄信息处理
      • 12.3.6 学长说--阶乘问题1--函数的嵌套调用
      • 12.3.7 学长说--阶乘问题--递归调用
      • 12.3.8 学长说--斐波拉契数列问题--函数递归调用
      • 12.3.9 章节通关测试--函数的嵌套、递归调用
    • 12.4 内部、外部函数变量的作用域和存储方式及函数应用
      • 12.4.1 课前挑战
      • 12.4.2 课程导入(WHERE)
      • 12.4.3 要点解析(WHAT)
      • 12.4.4 项目实战(HOW)--阶乘问题
      • 12.4.5 学长说--静态局部变量(static局部变量)
      • 12.4.6 学长说--输出1到5的阶乘值
      • 12.4.7 第四阶段测试:模块化程序设计
  • 13 数组与指针、指针变量作函数参数
    • 13.1 课前挑战
    • 13.2 课程导入(WHERE)
    • 13.3 要点解析(WHAT)
      • 13.3.1 指针的概念
      • 13.3.2 ​定义指针变量
      • 13.3.3 ​指针的运算
    • 13.4 项目实战(HOW)--指针的应用
    • 13.5 项目拓展(HOW)--指针的拓展应用
    • 13.6 章节通关测试--数组与指针、指针变量作函数参数
  • 14 结构体与共用体
    • 14.1 课前挑战
    • 14.2 课程导入(WHERE)
    • 14.3 要点解析(WHAT)
      • 14.3.1 结构体概念
      • 14.3.2 定义结构体
      • 14.3.3 声明结构体变量及赋值
    • 14.4 项目实战(HOW)--学生成绩
    • 14.5 项目拓展(HOW)--商品信息管理
    • 14.6 章节通关测试--结构体与共用体
  • 15 结构体指针、链表操作
    • 15.1 课前挑战
    • 15.2 课程导入(WHERE)
    • 15.3 要点解析(WHAT)
    • 15.4 项目实战(HOW)
    • 15.5 项目拓展(HOW)
    • 15.6 章节通关测试--结构体指针、链表操作
  • 16 文件操作
    • 16.1 课前挑战
    • 16.2 课程导入(WHERE)
    • 16.3 要点解析(WHAT)
    • 16.4 项目实战(HOW)
    • 16.5 项目拓展(HOW)
    • 16.6 第五阶段测试:C语言高级编程
  • 17 预编译和宏定义
    • 17.1 预编译概念
    • 17.2 #define命令
    • 17.3 #include命令
    • 17.4 条件编译
    • 17.5 其他指令
内部、外部函数变量的作用域和存储方式及函数应用

内部、外部函数变量的作用域和存储方式及函数应用

一 、课前知识提前学习

1、局部变量和全局变量

局部变量和全局变量

根据变量的声明方式将变量分为局部变量和全局变量。 

(1)局部变量 

在一个函数内部或复合语句块内定义的变量称为局部变量,其作用域仅限于函数内或复合语句块内。 根据函数的定义,一个函数内部定义的变量或函数的形式参数,与其他函数定义的变量之间没有关系,只能被当前函数的语句使用。当前函数也不能使用其他函数的局部变量。例如:

int func1(int a,int b)                   int func2( )                         main()

{                                                      {                                             {

    int i;                                                int i;                                        int i, j;

}                                                       }                                             }

其中,func1函数的局部变量是形式参数a和b以及变量i;func2函数的局部变量是变量i;main函数的局部变量是变量i和j。虽然func1,func2和main函数中都有一个整型的变量i,但因它们属于不同的函数,占据不同的内存单元,互相并不影响。 

编译系统开始并不为局部变量分配内存,只有在程序运行过程中,需要调用局部变量所在的函数时,才临时分配内存空间,调用结束后立即释放空间。 

(2)全局变量 

所有函数(包括main函数)之外声明的变量称为全局变量,其作用域是从定义的位置开始到本源程序文件结束。根据C语言“先声明后使用”的原则,如果试图在全局变量定义前使用它,将会导致编译出错。 

声明格式: [extern] 数据类型 全局变量名列表;
例如:

void func1()

{

    extern int gn;   /*确定gn在其它位置定义,是一个合法的全局变量*/

    gn=1;

}

int gn;           /*定义全局变量gn*/

main()

{

    func1();

}

编译器在编译func1内的gn=1语句之前,根据extern int gn已知道gn在其他位置定义,是合法的全局变量。使用extern对外部变量声明只是表明在该函数内或复合语句内要使用外部变量。由于全局变量在定义时就分配内存空间,可以在定义的同时赋初值。 例如:

int gn=10;


在一个源程序中,全局变量和局部变量可以同名,在局部变量有效的范围内,全局变量不起作用。 

一般来说,全局变量的定义总是放在源文件的首部,可以避免函数内部进行extern声明,声明位置后的函数都可以使用该全局变量。例如: /*全局变量gnNum定义源文件开始处,对后面的函数都有效*/

[extern] intgn;     

void func1()

{

     gn=1;

main()

{

     func1();

}

如果省略extern,外部全局变量的作用域只能是当前.C文件。 

如果只希望在当前文件内使用而不允许其它文件访问一个全局变量,需要将其显式声明为内部全局变量。 

声明格式:static 数据类型 全局变量名列表; 
例如:

static int gnVar=1;    

使用static全局变量可以增强源文件的独立性,不同文件的static全局变量互不影响,有助于源文件的移植。这些特点对于较大的程序是很有必要的。

全局变量方式破坏了函数的封装性能,还可使函数代码的可读性降低。因此,如果没有必要的话,最好不要使用全局变量。

2、变量的存储类型

变量的存储类型

程序运行后,内存中可供使用的存贮空间分为代码区(用于存放程序的二进制代码)、静态存贮区和动态存贮区三个部分,与程序相关的数据(变量)存放于静态存贮区和动态存贮区中。

存储在静态存贮区的变量称为静态变量。特点是在变量定义时就从静态存贮区内分配存储单元并一直保持,直至程序结束释放该变量(例如全局变量)。

存储在动态存贮区的变量称为动态变量。特点是在程序运行期间,根据需要随时在动态存贮区内分配存储单元,使用结束后马上释放该变量的内存空间(例如函数的形参)。

根据变量在内存中的存储位置,变量有auto、static、register等存贮类型。

(1)auto类型

auto类型变量存储在动态存贮区中,为动态变量,只在定义的函数内有效。

语法格式:[auto]数据类型 变量名[=初始化值];

例如:

auto int a=10; 或 int a=10; /* auto可以省略*/    

若没有为在函数体内定义的变量赋初值,则其初值随机。局部变量都是auto型变量。当函数被调用时,系统为该函数的局部变量分配内存,当调用过程结束,系统释放所有该函数的局部变量。动态变量的生存期是从其声明开始到其所在的语句块结束。

(2)registe类型

register变量存放在CPU的寄存器中。当需要使用register变量时,无须访问内存,直接从寄存器中读写。

语法格式:register数据类型 变量名;

例如:

register 数据类型 变量名;   

register变量只能是int、char或指针型。auto局部变量都可以做为register变量。全局变量和静态变量不能定义为register变量。由于CPU寄存器容量有限,不能定义太多的register变量。

(3)static类型

静态局部变量在函数调用结束后,其值仍然存在,并可能影响到下一次调用的过程。

声明格式:[static]数据类型 变量名;

例如:

static int b=10;   

静态类型变量(静态变量)分为静态局部变量和静态全局变量。

static局部变量是一种比较特殊的局部变量。它的作用域只能是当前的函数,其他函数不能引用它;但是存放在静态存贮区,其生存期从程序开始运行,知道程序结束后才被释放。利用static局部变量的特点,可以保存上次函数调用的某些结果。但是使用static局部变量会导致函数的多次调用之间发生联系,使代码的可读性降低。
静态全局变量既是内部全局变量,只作用于定义它的源文件,同一源程序的其他源文件不能对其使用。不论是否有static声明,该全局变量都存放在静态存贮区,生存期都是相同的。

static局部变量和auto局部变量对初值的处理不同。如果一个auto变量在定义时没有赋初值,那么它是一个随机值;如果没有对static局部变量赋初值,编译器将自动将其赋值为0(对于数值型变量)或空字符(对于字符型变量)。

3 、变量的生存期与作用域

变量的生存期与作用域


变量的生存期是指变量声明开始到其所占用内存空间被收回的全过程。变量的作用域是指变量所作用的范围。生存期和作用域变量体现了变量的特性,生存期表现了变量存在的时间,而作用域表现了变量活动的空间。两者既有关联,又有区别。例如:全局变量声明在函数外部。其生存期与应用程序的生存期相同。全局变量的作用域与其所在位置有关系,从其声明开始到所在的源程序结束。动态局部变量的生存期与其所在的语句块或函数有关系,其作用域为其所在语句块或函数体。静态局部变量的生存期与应用程序的生存期相同,其作用域为其所在语句块或函数体。

4、内部、外部函数

当一个程序由多个源文件组成时,如果一个函数可以被其他源文件调用,该函数就称为外部函数;如果一个函数只能被本文件中的函数调用,该函数就称为内部函数。

(1)外部函数

定义外部函数时,在函数名和函数类型之前加extern,表示可供其他函数调用,extern也可省略。

定义格式:[extern] 函数类型 函数名(形式参数)

例如:

extern int Add(int a,int b) 

{

      return a+b;

}

事实上,前面知识点所介绍的函数均为外部函数。

( 2)内部函数

定义内部函数时,只需在函数名和函数类型之前加static。

定义格式:static 函数类型 函数名(形式参数)

内部函数又称静态函数。使用内部函数,可以使函数仅局限于所在的文件,因而在不同文件中可以定义相同名称的内部函数而相互不干扰。