目录

1. 局部变量

2. 外部变量(全局变量)

2.1 全局变量属性

2.2 函数间通信方式

2.3 全局变量初始化

3. 程序块

4. 作用域

5. 单文件程序布局


1. 局部变量

局部变量的默认属性如下,

① 自动存储期限

a. 可用static修饰,使其成为静态局部变量,具有静态存储期限

b. 要注意静态局部变量对递归调用的影响

本质:占用同一内存区域(.bss段或.data段)

② 块作用域

说明1:什么是生存期和作用域

① 生存期(存储期限):在代码运行期间,从变量被定义开始直到他被销毁释放内存为止,这一变量存活(可以进行读写访问)的时期

② 作用域:可以对变量进行访问的代码区域

说明2:函数形参和局部变量拥有一样的性质,即自动存储期限和块作用域。函数形参和局部变量唯一真正的区别在于每次函数调用时对形参自动进行初始化(用相应实参的值)

2. 外部变量(全局变量)

2.1 全局变量属性

全局变量声明在任何函数体之外,默认属性如下,

① 静态存储期限

② 文件作用域

2.2 函数间通信方式

① 传递参数

这是提倡的通信方式

② 全局变量

使用场景:

a. 多个函数必须共享一个变量

b. 少数几个函数共享大量变量

缺点:破坏了函数的独立性

2.3 全局变量初始化

① 只能用编译时(compile-time)已知的值来初始化全局变量

② 全局变量的初始化发生在main函数执行之前

本质原因:已初始化为非0值的全局变量存储在.data段,在编译时必须确定其值

3. 程序块

{多条声明 //C89中声明必须在前多条语句
}

在程序块中使用临时变量的好处:

① 突出其用意

② 减少名字冲突

说明:程序块就是包含声明的复合语句

4. 作用域

标识符隐藏原则:当程序块内的声明命名一个标识符时,如果此标识符已经是可见的(因为此标识符拥有文件作用域,或者因为他已在某个程序块内声明),新的声明临时"隐藏"了旧的声明,标识符获得了新的含义,在程序的末尾,标识符重新获得旧的含义

int i = 1;
void f(void)
{int j = i; //使用全局变量int i = 2; //从此处开始隐藏了旧的标识符int k = i;
} //函数结束后,恢复使用全局变量

说明:在实际开发中,应避免这种标识符冲突的发生

5. 单文件程序布局

单文件程序推荐使用如下布局,

#include指令
#define指令
类型定义(typedef)
外部变量的声明
除main函数之外的函数的原型
main函数的定义
其他函数的定义

说明:布局解释

① 因为#include指令带来的信息可能在程序中的好几个地方都需要,所以先放置这条指令是合理的

② #define指令创建宏,对这些宏的使用通常遍布整个程序

③ 类型定义放置在外部变量声明的上面是合乎逻辑的,因为这些外部变量的声明可能会引用刚刚定义的类型名

④ 声明外部变量使得他们对于跟随在其后的所有函数都是可见的

⑤ 在编译器看见原型之前调用函数,可能会产生问题,而此时声明除main函数以外的所有函数可以避免这些问题。这种方法也使得无论用什么顺序编排函数定义都是可能的

⑥ 在其他函数前定义main函数使得阅读程序的人容易定位程序的起始点

建议:在每个函数定义前放盒型注释可以给出函数名、描述函数的目的、讨论每个形式参数的含义、描述返回值(如果有的话)并且罗列所有的副作用(如修改了外部变量的值)

C程序设计语言现代方法10:程序结构相关推荐

  1. c语言饿结构_C语言的四种程序结构

    C语言的四种程序结构 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电 ...

  2. 《go语言圣经》之程序结构

    <go语言圣经>之程序结构 说明:本内容整理自<go语言圣经> 1.命名 go语言的命名和其他语言差不多,一个名字必须以一个字母或者下划线开头,后面可以跟任意的数字和字母,命名 ...

  3. C程序设计语言现代方法15:编写大型程序

    目录 1. C语言程序一般构成 2. 源文件 2.1 源文件内容 2.2 将文件划分成多个源文件的优点 3. 头文件 3.1 包含头文件的3种方式 3.2 头文件共享内容 3.2.1 宏定义和类型定义 ...

  4. 单片机c语言三种经典程序结构,单片机C语言程序的结构和设计精选.docx

    单片机C语言程序的结构和设计精选 实验五 单片机C语言程序的结构和设计一.实验目的1. 掌握单片机C语言的程序结构:2. 掌握单片机C语言程序的编写和调试方法:3. 掌握MSP430FG2553基本I ...

  5. C程序设计语言现代方法18:声明

    目录 1. 声明的语法 2. 变量的性质 2.1 变量性质的构成 2.2 变量默认性质 2.3 修改变量默认性质 2.3.1 修改局部变量默认性质 2.3.2 修改全局变量默认性质 2.4 exter ...

  6. C程序设计语言现代方法17:指针的高级应用

    目录 1. 动态存储分配 1.1 malloc函数 1.2 calloc函数 1.3 realloc函数 1.4 free函数 2. 空指针NULL解析 2.1 NULL的定义形式 2.2 程序如何知 ...

  7. C程序设计语言现代方法14:预处理器

    目录 1. 预处理器工作原理 1.1 预处理器性质 1.2 预处理器主要功能 1.3 GCC编译过程及常用选项 1.3.1 GCC编译过程 1.3.2 编译选项实例 1.4 注意事项 2. 预处理指令 ...

  8. C程序设计语言现代方法08:数组

    目录 1. C语言中的变量 2. 一维数组 2.1 数组的声明 2.2 数组初始化 2.3 对数组使用sizeof运算符 3. 多维数组 4. 常量数组 4. C语言数组类型 4.1 数组类型 4.2 ...

  9. C程序设计语言现代方法07:基本类型

    目录 1. 基本类型和构造类型 1.1 基本类型 1.2 构造类型 2. C语言两大类型(存储格式根本上不同) 3. 整数类型 3.1 6种有效组合 3.2 整数常量 3.3 整数溢出 3.4 读写整 ...

最新文章

  1. mysql找安装路经,更改密码
  2. iOS32位唯一标识符
  3. android开发 修改标题栏背景_基于.NET的APP开发方式中MobileForm的使用smobiler
  4. python的urllib四大模块_Python常用的内建模块4:urllib
  5. hdata datax交流总结
  6. js获取服务器响应头信息,请问,js中请求头信息和返回头信息的方法
  7. matlab里面的if跟几个end,在编程中写两个end if 是什么意思
  8. Smart210使用superboot刷机
  9. php 判断是否为字符串,php怎么判断是不是字符串
  10. 配置静态路由/下一跳知识
  11. 简易的安卓天气app(四)——搜索城市、完善页面
  12. 系统设计之时间维度[数据仓库]
  13. 红石32位cpu通用计算机,【TRP|HappyWater】32位红石电脑RSC-3230(无命令方块)
  14. 区分QA和QC, Verification和Validation
  15. Linux /usr/src/kernels 目录为空的解决方法
  16. 适合国人的6款免费远程桌面工具,适用于电脑和手机
  17. 大数据体系构建数据仓库
  18. 车载系统大战:左边是BAT,右边是华为小米们
  19. 你对MySQL中的索引了解多少?
  20. 在线生成txt图案或者logo

热门文章

  1. php什么版本好玩_PHP各种版本区别对比详解
  2. 滑动轨迹 曲线 python_python曲线图
  3. linux传文件到其他用户,在linux中将文件从用户复制到另一个文件
  4. jquery html5引导页,jQuery插件实现的页面功能介绍引导页效果
  5. vueCli3 身份证正则校验
  6. mysql创建触发器的权限_MYSQL设置触发器权限问题的解决方法
  7. android怎么查看方法被谁调用,Android中查看布局文件中的控件(view,id)在哪里被调用(使用)...
  8. java 上传文件到服务器_java上传文件到OSS云服务器(二)
  9. vue js中解决二进制转图片显示问题
  10. WebSocket使用javax.websocket.RemoteEndpoint.Basic.sendObject(Object arg0)向页面方法发送对象