关于局部变量,全局变量,作用域,生命期的概念,程序内存分析

来源:互联网 发布:阿里云ecs教程 编辑:程序博客网 时间:2024/06/09 16:04
局部变量:
1,只能定义在他的区域或者语句中;
2,同一区域不能定义同一名变量
3,在变量所处区域的子区域重新定义同一变量,则大区域的变量被屏蔽
全局变量:
1,在函数外部定义的变量为全局变量
2,有效区域是从定义开始,到源文件结束
3,全局变量依然有定义屏蔽
4,结构化程序设计尽量不用全局变量;
作用域:
程序中的一段区域,c程序中每个名字都有唯一的实体对应;


全局作用域:文件作用域:从文件第一行到文件结束的区域
局部作用域:
函数作用域:从函数投开始到函数结束;
块作用域:由复合语句的大括号{}界定的区域
类型声明作用域:在结构体,共用体声明的大括号
函数原型作用域:形参列表所处的作用域;


多文件的作用域:
作用域规则:
1,同一个作用域不允许有相同名字的实体
2,实体包含它的作用域内,从定义或声明的位置开始,按文件的顺序往后直到作用域结束均是可见的;
3,可屏蔽大区域的实体,若自区域有同名实体;
4,可使用extern声明将变量或者函数实体的可见区域前伸,成为前置声明
5,变量或者函数实体使用 static修饰,则实体对于其他源文件是不可见的;


extern 不能给变量赋初值 作用是将全局变量前伸到定义处


int a=1,b=2;//全局变量
int c=10,d=11;//全局变量
void f1(int n,int m)
{
int x=21,y=22,z=23;
extern int h,k;//到此刻下面定义的h,k就可用了
n=n+t;
if(n>100)
{
int x=31,t=20;
n=x+y;
}
if(m>10){
int y=41;
n=x+y;
}
}






}
全局变量在不同文件中不能同名,也不能有相同的函数,因为连接会出错。
全局变量可以用在不同文件中;


不同文件的对象冲突
用static将对象设计成文件的”私有“;
不同的对象共享:

用extern把对象声明延伸



c源程序编译连接后成为二进制的可执行文件成为程序映像
elf文件格式:
内存从高到低:
命令行数据环境变量
自由空间{
栈 (向低内存地址生长)存放c程序中所有局部的非晶态型变量,临时变量,形参和函数返回值
运行时不会分配栈,只有调用函数时,才会分配
函数结束释放栈,如果不初始化,变量值是随机的;
堆(向高内存地址生长):  存放c程序中的动态分配的存储空间
可以通过对动态内存的申请,来分配堆,释放堆。
堆由程序员制定分配的大小,释放和分配时间;


}


静态空间{
未初始化数据段(未初始化的全局和静态变量,运行前数值全是初始化为0)
已初始化数据段(编译时已经确定了初值,运行时,没有初始化的动作)
代码段 全局常量(const)字符串常量,。。。
}






生命期:
对象是内存中具有类型的存储区
动态存储:系统为对象动态的分配存储空间;
static 返回类型 函数名(){
static  类型 变量名=初值;//这条语句在编译时已经完成赋值,所以运行时不会再运行这一条;


}
静态局部变量生命周期是整个运行时期
全局变量本来就是static的,


被调函数的代码嵌入到主调函数中
inline  返回类型  函数名()
{}
或者在函数原型声明时加入inline
注意:内联的声明必须在调用之前


会增加目标代码量,内联函数以目标代码的增加换取运行时间的节省
内联函数不允许用循环语句和switch语句
递归函数也不能用做内联函数,无法嵌入时,会忽略inline声明
应用在规模小,语句不多,语句简单而且频繁被调用。






递归算法:
Hanoi塔的问题
(1)分解为简单的问题
分别送一块两块开始
分治法:
基本原理:将一个规模为n的问题分解为k(1<k<n)个规模的问题
1,分解
2,解决
3,合并
例:整数划分问题




0 0
原创粉丝点击