问题 1 : 这样子定义一个不属于任何函数的变量正确吗?
问题 2 : 编译能通过吗?
问题 : 我们要打印的var 到底是 10 还是 100.
总结:
什么都不会输出,因为这里的 i++ ;是让局部变量的 i ++,程序会一直死循环
为什么都是 11,为什么没有持续的累积呐?
函数参数和和局部变量本质是一样的为什么?
因为他们都是存放在栈空间当中的,从内存的角度来看,他们是同一块内存区域里面的变量
分析下面程序中变量的生命期
int var = 1; //生命期最长,(程序开始运行的时候它被创建出来,程序结束的时候它才被销毁)全局变量和静态变量生命期最长
void func()
{
printf("var = %d\n" , var);
}
int main()
{
int var = 2;
int i = 0; //这 2 个局部变量的生命期等同于main函数的运行期,换句话来说main 被调用的时候他们被创建,main 函数返回的时候他们销毁
for(i=0;i<5;i++)
{
int var = 4; //它的生命期只是一次循环的时间 换句话来说这里被创建出来
var += i;
printf("var = %d\n",var);
} //在这里被销毁
func();
printf("var = %d\n", var);
return 0; //main 函数运行到这里的时候就被返回了
}
这里的空间指的就是代码段,在哪个代码段可以访问,在哪个代码段不能访问
生命期是从时间的角度上来访问一个变量是否可以访问,对于函数中的局部变量,当调用了这个函数他们才是可访问才是合法的 ,函数执行返回后这些局部变量就被销毁,不可再访问了
#include <stdio.h>
int func(int x)
{
static int a_var; //作用域并没有因为static 的修饰而改变 ,从这里开始 || 生命期因为 static 而延长了,是整个程序的运行期
s_var += x;
return s_var; //作用域到这里结束
}
int main()
{
int i =0; //定义了一个普通的局部变量,普通的局部变量生命期是多久? 就是从这个函数调用开始,
printf("Begin\n");
for(i=1; i<=5;i++)
printf("s_var = %d\n", func(i));
printf("End\n");
printf("s_var = %d\n", func(0));
return 0; //到这个函数的执行返回
}
#include <stdio.h>
int global; //只要是全局数据区中的变量,都会默认的初始化为0
int func(int x)
{
static int a_var; //全局数据区中的变量,默认初始化为0
//并且只做一次初始化
s_var += x;
return s_var;
}
int main()
{
int i = 0;
for()
{
}
printf("var = %d\n",func(0));
}
我们平时创建的普通变量等价
int i = 0; 等价于 使用了 auto关键字 auto int i =0;
寄存器 : 是处理器里面的存储单元,是确实的用来存储数据的,但是寄存器的数量很有限,想将变量放在寄存器里面就一定能成功吗?
变量 j 默认是一个自动变量,存储在栈空间 ,所以前面写不写 auto 无所谓
用 register 修饰 j ,大概率不成功
static 用来修饰这个全局变量有什么意义呐?
意义是将 g_sVar 变成了一个文件存储变量,只有在当前定义它的文件当中才能够访问
auto 和 register 不能修饰全局变量