大家好!我已经学习C语言1周啦!但是到现在都还没有接触到灵魂“指针”!我看了看我买的全部书关于指针的说明都很厚呢!预计指针的学习要占1半的学习时间(差不多1周的时间),差不多,第一次学完C语言需要2周时间,然后是汇编,操作系统原理,大约需要花费2个月时间。然后我打算边学习C++然后结合其反汇编代码进行学习,大约需要2周时间(也就是每写一行C++,然后写出对应的汇编代码。我想呢!C是C++的子集,这样应该没问题。)然后再学习C语言有关设计的部分,这部分我严格按照“系统程序员的成长计划”进行学习,预计需要2个月时间。然后再进行2周的从汇编到C++的反向学习,然后就进行WINDOWS程序设计的学习了,WINDOWS程序的设计大概要学2个月时间,然后就是WINDOWS内核驱动的学习大概要花2个月时间,然后就进行自我项目实践了!最后的实践项目我初步是定为,自己实现一个用户态和内核态调试器。上面的学习计划差不多是一年的时间!(在这里要谢谢指点我学习方向的计算机前辈!)
一:自动变量,静态变量和寄存器变量的定义:
根据变量存储位置不同,变量还可以分为自动变量,静态变量和寄存器变量
自动变量:局部没有经过任何修饰的局部变量叫自动变量 (它存在于动态数据区——栈),这个区域内的数据随着程序的运行动态的生成和释放,函数返回就释放,函数要调用就生成。关键字:默认是atuo(一般不写).
自动变量的特点:当程序执行到自动变量的作用域的时候就分配,不是到了声明代码才分配哦!到了代码分配就晚啦!当定义自动变量的函数执行结束后,程序将释放该自动变量的存储空间,留给其他自动变量使用。事例:
void add(int n)
{
auto int s =0;
s = s +1;
printf("No.%d: s=%d\n", n, s);
}
void main()
{
int i =1;
for(i; i<4; i++)
{
add(i);
}
}
输出为:
No.1: s=1 No.2: s=1 No.3: s=1
从这个例子不难看出,自动变量的初始值在每次分配存储空间后都要重新赋值。
静态变量:静态变量其实也存在于数据区和全局变量是一样的。但是静态变量在编译器级别有所限制(编译器对于静态变量的访问做了限制(对内存空间的限制有两种级别,一种是编译器级别,这种访问限制其实是编译器在做语法检查;第二种情况是操作系统级别,这种情况,要是你强制访问,操作系统可能会蓝屏或者报警告错误!))。调试证明:
这个证明:静态变量其实也存在于数据区和全局变量是一样的.
再看这个例子:
这里为什么会编译错误呢!显示x没有定义。这当然大家都知道,但是为什么呢?!同样是数据区的东西为什么访问不了!我们再来看下下面的代码:
这里可以看到。0x88888888和0x12312312明明就是在一块的,为什么就不能访问呢。原因看下面的图(注意:下面是打开的.obj文件,也就是链接之前的那个文件):
我们把这些信息用注释的方式写到代码里看起来要好些:
我们从这里可以清楚的看到,静态变量被重新命名了,所以造成了无法访问的问题。注意看重命名的规则,它集成了它所在的函数信息,变量和函数绑定了。有一定的规则!不过这个在编译器内部规定,不同编译器的规则是不一样的。只要知道静态变量的原理即可。
静态变量生存周期:和全局变量一样,从可执行文件被加载到程序结束(它出生比main函数早,死亡比main函数晚)。
局部静态变量:它的存储区还是在数据区。
全局静态变量无法夸文件,也是编译器级别的控制。
静态变量的作用:实现私有。
寄存器变量:我觉得这个可以不用说了,因为我通过调试和实践发现寄存器变量分明就是鸡肋!不用管它!
唉!学了8小时了,头有点晕乎乎的了!我去逛逛街回来再继续!