局部变量 静态局部变量 全局变量与静态局部变量

基本概念: 作用域:起作用的区域,也就是可以工作的范围。

代码块:所谓代码块,就是用{}括起来的一段代码。

数据段:数据段存的是数,像全局变量就是存在数据段的

代码段:存的是程序代码,一般是只读的。

栈(stack):先进后出。C语言中局部变量就分配在栈中。

局部变量

  普通的局部变量定义的时候直接定义或者在前面加上auto

void func1(void)
{
 int i = 1;
 
 i++;
 
 printf("i = %d.\n", i);
}
局部变量i的解析:
在连续三次调用func1中,每次调用时,在进入函数func1后都会创造一个新的变量i,
并且给它赋初值1,然后i++时加到2,
然后printf输出时输出2.然后func1本次调用结束,
结束时同时杀死本次创造的这个i。这就是局部变量i的整个生命周期。
下次再调用该函数func1时,又会重新创造一个i,经历整个程序运算,
最终在函数运行完退出时再次被杀死。

静态局部变量(static) 静态局部变量定义时前面加static关键字。

总结:

1、静态局部变量和普通局部变量不同。静态局部变量也是定义在函数内部的,静态局部变量定义时前面要加static关键字来标识,静态局部变量所在的函数在多调用多次时,只有第一次才经历变量定义和初始化,以后多次在调用时不再定义和初始化,而是维持之前上一次调用时执行后这个变量的值。本次接着来使用。

2、静态局部变量在第一次函数被调用时创造并初始化,但在函数退出时它不死亡,而是保持其值等待函数下一次被调用。下次调用时不再重新创造和初始化该变量,而是直接用上一次留下的值为基础来进行操作。

3、静态局部变量的这种特性,和全局变量非常类似。它们的相同点是都创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同

全局变量 定义在函数外面的变量,就叫全局变量。

普通全局变量  普通全局变量就是平时使用的,定义前不加任何修饰词。普通全局变量可以在各个文件中使 用,可以在项目内别的.c文件中被看到,所以要确保不能重名。

静态全局变量  静态全局变量就是用来解决重名问题的。静态全局变量定义时在定义前加static关键字, 告诉编译器这个变量只在当前本文件内使用,在别的文件中绝对不会使用。这样就不用担心重名问题。所以静态的全局变量就用在我定义这个全局变量并不是为了给别的文件使用,本来就是给我这个文件自己使用的。

跨文件引用全局变量(extern) 就是说,你在一个程序的多个.c源文件中,可以在一个.c文件中定义全局变量g_a,并且可以在别的另一个.c文件中引用该变量g_a(引用前要声明)

函数和全局变量在C语言中可以跨文件引用,也就是说他们的连接范围是全局的,具有文件连接属性,总之意思就是全局变量和函数是可以跨文件看到的(直接影响就是,我在a.c和b.c中各自定义了一个函数func,名字相同但是内容不同,编译报错。)。

局部变量和全局变量的对比:
1、定义同时没有初始化,则局部变量的值是随机的,而全局变量的值是默认为0.
2、使用范围上:全局变量具有文件作用域,而局部变量只有代码块作用域。
3、生命周期上:全局变量是在程序开始运行之前的初始化阶段就诞生,到整个程序结束退出的时候才死亡;而局部变量在进入局部变量所在的代码块时诞生,在该代码块退出的时候死亡。
4、变量分配位置:全局变量分配在数据段上,而局部变量分配在栈上。

//static

 1 #include <stdio.h>
 2
 3
 4 void func1(void);
 5 void func_static(void);
 6 void func_static2(void);
 7 void func_global(void);
 8 void func_register(void);
 9
10 int g_a = 1;
11
12
13 int main(void)
14 {
15     //a = 4;            // 编译报错,未定义
16     g_a = 5;            // 可以,因为g_a是全局变量,所以到处都可以用
17
18     func1();        // i = 2
19     func1();        // i = 2
20     func1();        // i = 2
21
22     func_static();    // a = 2
23     func_static();    // a = 3
24     func_static();    // a = 4
25
26     func_static2();    // a = 4;
27     func_static2();    // a = 7;
28     func_static2();    // a = 10;
29
30     func_global();    // g_a = 4;
31     func_global();    // g_a = 7;
32     func_global();    // g_a = 10;
33
34     func_register();
35     func_register();
36     func_register();
37
38
39
40
41 // 因为i是定义在函数func中的局部变量,所以i的作用域为代码块作用域,所以i只在func1
42 // 函数内部有效,在func1外面是不能访问i的。所以这里i会无定义。
43     //i = 5;        // error: ‘i’ undeclared (first use in this function)
44
45     return 0;
46 }
47
48
49 void func1(void)
50 {
51     int i = 1;                // 普通的局部变量,auto可以省略的
52     //auto int i = 0;            // 自动局部变量,其实就是普通局部变量
53
54     i++;
55
56     printf("i = %d.\n", i);
57 }
58
59 void func_static(void)
60 {
61     static int a = 1;        // 静态的局部变量
62
63     a++;
64
65     printf("a = %d.\n", a);
66 }
67
68 void func_static2(void)
69 {
70     static int a = 1;        // 静态的局部变量
71
72     a += 3;
73
74     printf("a = %d.\n", a);
75 }
76
77 void func_global(void)
78 {
79     g_a += 3;
80
81     printf("g_a = %d.\n", g_a);
82 }
83
84 void func_register(void)
85 {
86     register int a = 1;        // 静态的局部变量
87
88     a += 3;
89
90     printf("a = %d.\n", a);
91 }

//globle

 1 #include <stdio.h>
 2
 3
 4 int g_i = 13;
 5
 6
 7 // 实验结论:
 8 // 首先,main函数是一个程序运行最开始执行的东西,所有的其他函数都只能在main函数中被
 9 // 直接或者间接的调用才能被执行。main函数的执行其实就是整个程序的生命周期,main函数
10 // 一return返回,整个程序就结束了。
11 // 其次,全局变量的定义和初始化是在main函数运行之前发生的。
12 int main(void)
13 {
14     printf("g_i = %d.\n", g_i);
15
16     return 0;
17 }
 1 #include <stdio.h>
 2
 3
 4 void func_in_a(void);
 5 extern int g_a;                // 声明了一个int变量g_a
 6 //extern int g_b;
 7
 8 void func_in_b(void)
 9 {
10     printf("I am func in b.c.\n");
11 }
12
13
14 int main(void)
15 {
16     printf("I am main in a.c.\n");
17     printf("I am main in a.c, g_a = %d.\n", g_a);
18     printf("I am main in a.c, g_a = %d.\n", g_b);
19
20
21     //func_in_b();        // 直接调用
22
23     func_in_a();        // 间接调用
24
25     return 0;
26 }
 1 #include <stdio.h>
 2
 3
 4
 5 void func_in_b(void);
 6
 7 int g_a = 12;
 8 int g_b = 111;
 9
10
11
12
13
14
15 void func_in_a(void)
16 {
17
18     g_a = 24;
19
20     printf("I am in func_in_a of a.c, g_a = %d.\n", g_a);
21     func_in_b();
22 }
23
24 /*
25 // 定义错误
26 // C语言中,定义函数都必须在外面,不能在一个函数里面定义别的函数
27 // 所以没有局部函数,只有全局函数。
28
29 void func1(void)
30 {
31     int a;
32
33
34     void func2()
35     {
36         int b;
37     }
38 }
39
40 */

//最后两个分别为a.c b.c 文件目录为

时间: 2024-10-25 06:51:59

局部变量 静态局部变量 全局变量与静态局部变量的相关文章

C/C++语言变量问题(全局变量、局部变量、静态全局变量、静态局部变量)

1.C/C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局作用域.全局变量只需在一个源文件中定义,就可以作用于所有的源文件.当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量. 2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的

C++局部变量、全局变量、静态变量(堆、栈、静态存储区)

1 static关键字 1.1 隐藏 eg: //a.c文件中 char a = 'A'; void msg() { printf("Hello\n"); } //main.c文件中 extern char a; printf("%c",a); 输出结果:A Hello 所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问.a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的. 如果加了stat

静态变量,全局变量,局部变量的区别

1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局作用域.全局变量只需在一个源文件中定义,就可以作用于所有的源文件.当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量. 2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静

【C语言】局部变量、全局变量,局部静态变量,全局静态变量,extern,static的区别

局部变量: 创建在栈区(向下生长),生命周期存在于当前作用域中.     创建时若未初始化,则为随机值. 全局变量: 创建在static区,生命周期一直存在. 创建时若未初始化,则为0. 静态局部变量: 切断了外部链接属性.创建在static区. 创建时若未初始化,则为0. 全局变量和静态变量的存储是放在一块的,初始化了的全局变量和静态变量在一块区域,  未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 全局静态变量: 切断了外部链接属性,创建在static区,生命周期一直存在. 创建

全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别

一.程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3.全局区(静态区)(static)- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变

C++中的全局变量、普通局部变量和静态局部变量的区别

在C++中,我们经常难以说清楚全局变量.局部变量和静态局部变量的区别.本博客从变量存储特性和标识符作用域两个角度区分这三个变量. 首先,我们来看看C++程序的内存区域是如何分配的. 从上图,我们可以看到,C++程序的内存区域分为代码区.全局数据区.堆区和栈区.其中,全局变量和静态局部变量存放在全局数据区,这两个变量在程序开始时就已经分配和初始化存储空间了.而普通局部变量存放在栈区,它在程序进入声明的代码块时生成,在结束代码块时删除. 其次,从标识符作用域的角度,我们可以认为: 1. 全局变量和静

C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 (转)

1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局作用域.全局变量只需在一个源文件中定义,就可以作用于所有的源文件.当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量. 2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而

全局变量、局部变量、实例变量以及静态变量的区别

全局变量(globals): 也称为成员变量,属于某个类中定义的变量.在整个类中有效. 可分为: (1).类变量:又称静态变量,用static 修饰,可直接用类名调用,所有对象的同一个类变量都是共享同一块内存空间的. (2).实例变量:不用static修饰, 它只能通过对象调用 ,所有对象的同一个实例变量是共享不同的内存空间的. 局部变量(Local variables):是指那些在方法体中定义的变量以及方法的参数,它只在定义它的方法内有效.是相对于全局变量而言的. 当全局变量与局部变量同名时:

生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域

生命周期,作用域的定义:说明全局变量.静态变量.局部变量.const变量的生命周期.作用域: 生命周期:是一个变量存在的周期. 作用域:是一个变量可以被引用的范围.最常见的如:{}.static修饰符等等. 1)全局变量: 作用域:全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件): 生命周期:程序运行期一直存在: 引用方法:其他文件如果要使用,必须用extern 关键字声明要引用的全局变量: 内存分布:全局(静态存储区). 注意:如果再两个文件中都定义了相同名字的全局变量,则连接