以{}为划分依据,分为全局变量与局部变量。
例外:函数参数也是局部变量。
作用域的最大单位是文件(编译的最小单位是文件),作用域的最小单位是{},全局变量的作用域的文件,局部变量的作用域是{},变量的作用域,始于定义处,结束预作用域结束。
相同的作用域内不可以有重名的变量。
当局部变量发生重名的时候,局部会覆盖全局的变量,小范围与大范围的变量发生重名的时候,小范围会覆盖大范围的变量。
局部变量的生命周期早所在的函数,全局变量的声明周期同main()。
修饰类型影响了变量的生命周期和存储区域。
局部变量在缺省存储类型的情况下归为自动变量。
作用:修饰局部变量
存储区域: 栈
生命周期:同所在的函数或作用域
特点:如未初始化,初始值未知。大将军变量,随用随开,用完即消。
存放在 cpu 的寄存器中。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。
作用:修饰局部变量影响了变量的存储区域
存储区域:寄存器
生命周期:同所在的函数或作用域,随用随开,用完即消。
特点:如未初始化,初始值未知。不可取地址,易被编绎器优化。
在程序执行时存在,并且只要整个程序在运行,就可以继续访问该变量。
作用:修饰局部变量和全局变量
存储区域:数据区
生命周期:同 main()
特点:只初始化一次, 默认初始化为 0,生命周期同 main();影响了全局变量的作用域和局部变量生命周期。
扩展全局的作用域。同文件中,或不同文件中。
作用:修饰全局变量。
存储区域:数据区
生命周期:同 main()
特点:因为是修饰的是全局变量,所以只扩展了其作用域(本文件内或跨文件)。
定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
2.提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
程序:源**经过编译器编译后生成的可执行文件,静态的概念。
进程:可执行文件,运行后被加载在内存中运行,运行的过程,即为进程。以下是可执行文件加载到内存后的分布情况,动态的概念。
首先32为操作系统采用虚拟内存技术,将4g的虚拟地址空间划分为两个部分:用户空间和内核空间。用户空间从0到0xbfffffff,内核空间从3g到4g。用户进程不能访问内核。
程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。这样,只要操作系统处理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。
进程空间分布。
如下图:2.3.1栈内存。
栈区(stack)有编译器自动分配释放,存放函数的参数,局部变量等。在windows中,栈是向低地址扩展的数据结构,是一块连续的内存区域。也就是栈顶的地址和栈的最大容量(windows是2m)是系统规定好的。
如果申请的空间超过剩余栈空间,将提示overflow,因此从栈获得的空间较小。栈空间不能返回。
2.3.2堆内存。
堆区(heap)一般由程序员分配和释放,否则就由os**。堆用于存放全局变量,静态变量,常量字符串和函数**(函数体的二进制**).堆:
堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于系统中有效的虚拟内存。由此可见堆的内存获得比较灵活,空间较大。
另外对内存可以在函数中返回。
堆内存的申请与释放。
malloc:
void *malloc(size_t,size),malloc 函数在堆中分配参数_size 指定大小的内存,单位:字节,函数返回 void*指针。
calloc:
void*calloc(size_t nmemb,size_tsize); 第一个参数是所需内存单元数量,第二个参数是每个内存单元的大小(单位:字节), calloc 自动将分配的内存置 0
realloc
void*realloc(void*ptr,size_t size); 第一个参数 p 为之前用 malloc 或者 calloc 分配的内存地址,_newsize 为重新分配内存的大小,单位:字节。成功返回新分配的堆内存地址,失败返回 null.
如果参数 p 等于 null,那么 realloc 与 malloc 功能一致 realloc 新分配的空间不会像 calloc 自动清空,而是像 malloc 一样需要手动清空。
freevoidfree(void *p); free 负责在堆中释放 malloc 分配的内存。参数 p 为 malloc 返回的堆中的内存地址。
堆内存的常见错误。
释放以后继续使用是错误的。
通过函数返回堆里的内存。
常见错误:栈上的空间不能返回,只读数据区数据不能修改。在返回值的时候要具体情况具体对待,要清楚返回的指针是在常量区还是在栈区等。
并且如果指针作为参数的时候是传入本身还是能够修改值。
1.通过返回值返回。
struct是结构体的关键字。
仅在本地使用,不能带来多余的类型名。但需要定义的时候同时定义变量。
struct
char name[30];
char sex;
int age;
float high;
stu;一处定义,可以多出使用。
struct student
char name[30];
char sex;
int age;
float high;
stu;struct student stu2;
更好使用的结构体。
typedef struct student
char name[30];
char sex;
int age;
float high;
student;
student stu, stu2;
3.4结构体类型变量的初始化以及访问。
凡是构造类型,要么在定义的时候初始化,要么先定义再成员分别初始化。
访问访问方式有两种一类是(.)成员运算符,一类是(->指向运算符。
同类结构体间可以相互赋值。
3.5结构体数组。
举例:3.6结构体中嵌套结构体。
c语言笔记整理
1.源程序 c 预处理 目标程序 obj 连接 可执行语言 exe 其中源程序是程序设计语言,其余的为机器语言。枚举类型数据。3.在字符串本身中含有双引号的用法 4.单目运算符的优先级高于双目运算符。5.三种结构 顺序结构,选择结构,循环结构。6.输出表中,要输出的数据可以是没有的。7.变量编名,字...
C语言笔记
第一课时。c语言标准格式。include vidomain 以 开头的语句称为预处理指令。include语句不是必须的,但是如果一旦有该语句就必须把它放在文件开始处是standared input output header的缩写standared 标准input 输入output 输出header...
C语言笔记
c语言算法和数据类型。整型。基本类型 字符型注释 基本类型的特点是其不可实型 单精度型以再分解为其他类型双精度型数组型。数据结构 构造型 结构体型共用体型指针型空类型。一 常量。define 语句不以分号结尾,它可以放在源 的任何位置。不过在定义常量时,只有在它定义后的源 中才有效。是一个修饰符,在...