变量和常量
常量:在程序执行过程中值不会发生变化的量。
分类:整型常量、实型常量、字符常量(由单引号引起来的字符或转义字符:\t,\n,\017等)、字符串常量,标识常量(#define)
变量:用来保存一些特定内容,并且在程序执行过程中随时会发生变化的量。
[存储类型] 数据类型 标识符 = 值
TYPE NAME = VALUE ;
标识符:给某段内存空间起个名字而已,尽量做到见名生义
存储类型:auto static register extern(说明型关键字)
auto:默认,自动分配空间,自动回收空间。在栈上
register(建议型):寄存器类型,资源少速度快,只能用于局部变量,不能定义全局变量,只能定义32位大小的数据类型(32位环境),寄存器中没有地址,所以一个寄存器类型的变量无法打印出地址查看或使用。
static(静态型):自动初始化为0或空值,并且有继承性。
extern(说明型):不能够改变被说明的变量的值。
=============================================
#define 宏名 (宏体) //并不做语法检查
eg:#define PI 3.1415
define可以带参数
#define MAX(a,b) ((a)>(b) ?(a):(b))
==============================================
#define在预处理的过程中处理,占用的是编译时间
函数在调用的位置,对当前的执行现场进行压栈保存,然后跳往函数的入口地址执行,函数执行完毕后,弹栈恢复现场,占用的是运行时间
==============================================
进程的内存布局:
代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。
数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。
BSS段:BSS段包含了程序中未初始化的全局变量,在内存中 bss段全部置零。
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈:栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。