c全局变量多线程调⽤_c语⾔局部变量静态局部变量全局变量
与静态全局变量...
基本概念: 作⽤域:起作⽤的区域,也就是可以⼯作的范围。
代码块:所谓代码块,就是⽤{}括起来的⼀段代码。
数据段:数据段存的是数,像全局变量就是存在数据段的
代码段:存的是程序代码,⼀般是只读的。
栈(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
#include <stdio.h>
void func1(void);
void func_static(void);
void func_static2(void);
void func_global(void);
void func_register(void);
int g_a = 1;
int main(void)
{
//a = 4;            // 编译报错,未定义
g_a = 5;            // 可以,因为g_a是全局变量,所以到处都可以⽤
func1();        // i = 2
func1();        // i = 2
func1();        // i = 2
func_static();    // a = 2
func_static();    // a = 3
func_static();    // a = 4
func_static2();    // a = 4;
func_static2();    // a = 7;
func_static2();    // a = 10;
func_global();    // g_a = 4;
func_global();    // g_a = 7;
func_global();    // g_a = 10;
func_register();
func_register();
func_register();
// 因为i是定义在函数func中的局部变量,所以i的作⽤域为代码块作⽤域,所以i只在func1
// 函数内部有效,在func1外⾯是不能访问i的。所以这⾥i会⽆定义。    //i = 5;        // error: ‘i’ undeclared (first use in this function)
return 0;
}
void func1(void)
{
int i = 1;                // 普通的局部变量,auto可以省略的
//auto int i = 0;            // ⾃动局部变量,其实就是普通局部变量
i++;
printf("i = %d.n", i);
}
void func_static(void)
{
static int a = 1;        // 静态的局部变量
a++;
printf("a = %d.n", a);
}
void func_static2(void)
{
static int a = 1;        // 静态的局部变量
a += 3;
printf("a = %d.n", a);
}
void func_global(void)
{
g_a += 3;
printf("g_a = %d.n", g_a);
}
嵌入式多线程编程void func_register(void)
{
register int a = 1;        // 静态的局部变量
a += 3;
printf("a = %d.n", a);
}
//globle
int g_i = 13;
// 实验结论:
// ⾸先,main函数是⼀个程序运⾏最开始执⾏的东西,所有的其他函数都只能在main函数中被// 直接或者间接的调⽤才能被执⾏。main函数的执⾏其实就是整个程序的⽣命周期,main函数// ⼀return返回,整个程序就结束了。
// 其次,全局变量的定义和初始化是在main函数运⾏之前发⽣的。
int main(void)
{
printf("g_i = %d.n", g_i);
return 0;
}
#include <stdio.h>
void func_in_a(void);
extern int g_a;                // 声明了⼀个int变量g_a
//extern int g_b;
void func_in_b(void)
{
printf("I am func ");
}
int main(void)
{
printf("I am main ");
printf("I am main in a.c, g_a = %d.n", g_a);
printf("I am main in a.c, g_a = %d.n", g_b);
//func_in_b();        // 直接调⽤
func_in_a();        // 间接调⽤
return 0;
}
void func_in_b(void);
int g_a = 12;
int g_b = 111;
void func_in_a(void)
{
g_a = 24;
printf("I am in func_in_a of a.c, g_a = %d.n", g_a);
func_in_b();
}
/*
// 定义错误
// C语⾔中,定义函数都必须在外⾯,不能在⼀个函数⾥⾯定义别的函数
// 所以没有局部函数,只有全局函数。
void func1(void)
{
int a;
void func2()
{
int b;
}
}
*/
//最后两个分别为a.c b.c ⽂件⽬录为
C/C++学习资料分享交流:1093776732 ⼊有全套学习视频资料电⼦书免费赠送!参考资料:
物联⽹开发⼊门直播课 - 嵌⼊式/物联⽹-C语⾔编程基础w ww.makeru 嵌⼊式开发直播课 - 带你提升C编程能⼒www.makeru
嵌⼊式底层开发 - 夯实C语⾔,从⼩⽩到⼤⽜的进阶之路!w ww.makeru
嵌⼊式开发直播课 - 嵌⼊式-指针w ww.makeru

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。