|
发表于 2015-8-12 00:32:44
|
显示全部楼层
本帖最后由 默默路过 于 2015-8-12 00:35 编辑
//不知道楼主是否真的懂了,简单提一点个人意见希望有帮助
//楼主这个 关于作用域的问题是其一,其二还有就是关于C本身的内存处理的一些问题了
//在C里面一般的函数的局部变量我们知道都是在函数本身的栈中临时开辟的,随着函数调用的结束
//相关的所有局部变量都会被释放掉,这是 局部变量的生命周期(函数调用开始到函数调用结束);
//而全局变量的生命周期是程序开始到程序的结束,同样的他的存在位置就不在是任何函数的栈区了,
//全局变量和静态变量都是存在于一块叫 静态内存区的地方,这块内存区的生命周期也是从程序的开始
//到程序的结束,这是基本要注意的地方;下面说代码:
#include <stdio.h>
int a=2; //此处全局变量必然在静态内存区中 楼主可以再此处下断点然后查看内存 &a,这时可以看到其地址和值
int f(int n)
{
static int a=3;//此处是函数f的静态局部变量,同样在静态类存区,同上方式查看内存你会发现 它就在全局a的后面
int t=0;
if(n%2)
{
static int a=4;//此处呢是一个复合语句的局部变量,同上看内存,你会看到他在函数静态局部变量a的后面
t+=a++;//离开这里以后 a 不会消失,也不会被覆盖,定义的代码只会在首次调用时执行,其后不被执行但是一直存在 下次来 a就是5了
}
else
{
static int a=5;//此处也是一个复合语句的局部变量,同上看内存,你会看到他在if静态局部变量a的后面
t+=a++;//离开这里以后 a 不会消失,也不会被覆盖,定义的代码只会在首次调用时执行,其后不被执行但是一直存在 下次来 a就是6了
}
return t+a++;//简单的一点所有变量都必须服从作用域原则。选择当前作用域内最近的变量值,这个其实和汇编的调用有一定的关系,
//就不展开说了,if 和else 的静态变量的作用域无法覆盖这句代码,而全局的a和函数的a都有覆盖,但是函数的a更近,
//所以此处操作和返回的必然是 函数的 静态局部变量了 也就是返回 , 8 , 8 , 13,但愿口算没出错
}
int main()
{
int s=a,i; //这个a 必然是全局的a了;
for(i=0;i<3;i++)
{
s+=f(i);
}
printf("%d\n",s);
return 0;
//终上所述在静态内存去中一共有4个不一样的a 分别属于4个作用域;都是在程序的开始到结尾都存在。
//区别只是使用的地方不同
}
//最后建议楼主 学会 单步调试中查看内存,这样的话很多东西,你的理解会跟进一步,不是仅仅只停留在使用的层面上
//C 中 重要的就是操作内存,所以,对于内存要了然于胸,每一变量,常量,甚至是函数地址(这一点我也还没达到。。。)在
//内存中的什么区域(这个区域不是说地址段的范围,没必要到那样的程度)都要清清楚楚,那么遇到问题就方便很多了!
//主要是 栈、堆、静态内存区、常量内存区、指令区(可以不管),前面三个是基础---说了不少闲话,希望有用!
//前面 内存 查看地址本来想放截图的,想想,希望楼主自己去验证一番! |
|