标签:语句块 ola while 释放内存 数据传递 编译器 告诉 方便 作用
复习:
自定义函数:
1、函数声明 告诉编译器函数的格式,方便它检查调用者的参数、返回值。
2、隐式声明 当调用函数时如果没有声明和定义,编译器会猜测函数的格式,函数的形参按照调用者的实参猜测,返回值默认int。
3、函数定义 函数的定义出现在调用之前可以省略声明。
3、函数传参
值传递:普通变量 函数之间不能共享同名变量(局部)。
址传递:数组的长度会丢失,需要额外增加一个参数传递数组的长度,同时该数组会被两个函数共享(调用者和被调用者);
返回值:return语句不是给把数据传递给调用者,而放在一个他们都能访问的位置,如果函数中没有return语句,那么该位置的值就是一个随机的垃圾值(上上次函数的返回值)。
进程映像:
程序:存储在磁盘上的文件(二进制、脚本)
进程:系统中正在运行的程序,进程映像指的是进程的内存分布。
text 代码段 二进制指令 常量 只读,强制修改会产生段错误。
data 数据段 被初始化过的全局变量、静态变量。
bss 静态数据段 未初始化过的全局变量、静态变量,该段内存在运行时会先清理为0(全局变量、静态变量默认为0)。
heap 堆 由于程序员手动管理,特点是够大。
stack 栈 大小有限超过限制会产生段错误,由系统管理,会随着函数的调用分配内存,函数执行结束释放内存。
变量的分类:
存储位置、生命周期、使用范围
全局变量:定义函数外
data或bss
从程序运行开始到程序执行结束
任何位置可以使用
局部变量:定义在函数内
stack
从定义位置开始到函数执行结束
只能在函数内使用
块变量:定义在if、for、while等语句块内的
stack
从定义位置开始到函数执行结束
只能在语句块内使用
全局变量、局部变量、块变量可以重名,局部变量会屏幕同名的全局变量,块变量会屏幕同名的全局变量、局部变量。
类型限定符:
auto 用于定义自动分配、释放内存的变量,不加就代表加。
不能在全局变量前使用,也不能static同时使用。
extern 用于声明全局变量
当a.c中定义一个全局变量,b.c中如果想使用就需要用extern声明一下。
extern 声明只能渡过编译阶段,如果链拉时找不到,依然会报错。
static
限制作用域
全局变量、函数
改存储位置
局部变量、块变量 由 stack 改为 data或bss
延长生命周期
局部变量、块变量 不会被销毁 它们的初始化语句只是第一次有效。
const
用于"保护"变量不被显式修改。
初始化过和全局变量和静态变量被 const 修饰后存储位置会变成text,就成为了真正的常量,再强行修改就会产生段错误。
volatile
如果变量没有显式的被修改,再使用变量时就会继续使用上次从内存中读取到的值,而不会重新读取(编译器的优化)。
有些变量可能会被隐式修改,要想随时得到变量的最新值就需要用 volatile 修饰一个。
在硬件编程、多线程编程时使用。
register
申请把变量的存储位置由内存改为寄存器,这样能提高变量的读写速度,从而提高程序运行速度。
由于寄存器数量不多,不是每次申请都能成功。
注意:这种变量不能被取地址。
typedef
类型重定义,当定义变量时,前面加上typedef,变量名就变成了这种类型。
常用的:size_t time_t uint8_t 都是使用typedef重新定义的。
注意:不是替换。
五子棋:
需要的数据:
1、定义棋盘数组
2、定义变量用于记录棋子位置
3、定义角色变量
业务逻辑:
是否需要对数据进行初始化
for(;;)
{
1、清理屏幕,显示棋盘
2、落子
坐标要合法,原位置不能有棋子
3、检查是否形成五子
4、切换角色
}
标签:语句块 ola while 释放内存 数据传递 编译器 告诉 方便 作用
原文地址:https://www.cnblogs.com/Nxet/p/13352533.html