C语言中的全局变量,局部变量,include,extern, static, volatile详解

这是我对C语言语法系列的一些博客收集,现整理起来。建议花20分钟阅读,大有收获。

首先是变量(全局变量,局部变量)的分类。  

全局变量、局部变量和静态变量_静态全局变量

全局变量的作用域是定义点到文件末尾,如果在定义点之前(同一个C文件中)使用全局变量,则需要在使用的地方加extern,在extern会提到这点。而如果其它C文件想使用这个全局变量,则必须加extern,告诉编译器其它的c文件有定义这个变量。而且,其它文件也不能再定义一个同名全局变量,因为其作用域是整个系统,再定义就会说重复定义了。

主函数是一下函数,只做了一个定义。

#include <stdio.h>
int a=0;
int main(void)
{
	while(1)
	{
		
	}
}

在另外一个fun.c 文件做一下定义 

int a=0;

说我重复定义了。因此,如果在头文件中定义一个全局变量,一旦超过两个C文件引用这个头文件,就会说重复定义。

如果是静态局部变量(函数内部定义的静态变量),则实际上改变的是存储方式和生命期(与局部变量相比)。底层如果想更改局部变量的生命周期,就必须要把静态局部变量放到初始化了的数据区,而不能放到局部变量的存储区域(栈区)因为函数在执行的时候局部数据是放在栈中的,退出函数时候这些局部变量会被销毁。如果是静态全局变量,实际上改变的是作用域(与全局变量相比),它们本身就在数据区了,只不过只能限制本文件使用。静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节, 在程序运行过程中被分配的字节大小是不改变的,只有程序运行结束后,才释放所占用的内存。这说明全局变量、静态变量的生命期和程序生命期是一样的,在程序结束之后操作系统会回收空间。对于这类放在数据区的数据,如果最开始只是声明而没有赋值,则初始化的时候默认为0,会放到BSS段(ZI段),如果被初始化了就会放到DATA段(RW段)。

static局部变量只被初始化一次,下一次依据上一次结果值。

了解了这些就再看看include的解析

C语言中#include的介绍——及常见的头文件(库函数)-CSDN博客w

对Include的理解就是它会把头文件中的内容全部复制到使用include的地方,我们知道,在使用一个函数或者变量,或者使用一个结构体之前,必须要对其声明,不一定需要赋值。函数也是这样,头文件中只是声明。

静态变量详解

c语言中static关键字用法详解_static在c语言中的用法-CSDN博客

 静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。静态局部变量在全局数据区分配内存空间;编译器自动对其初始化。其作用域为局部作用域,当定义它的函数结束时,作用域随之结束(也就是说,在两个不同的函数中定义同名的静态局部变量,虽然都放在数据区,但是不会互相干扰)。

在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

注意在这篇博客中,它为什么在它的最后一个例子中,就算file2.c没有添加file,c的头文件,它还是可以编译成功,是因为gcc的编译时候是先编译的file,c,再编译file2.c。此时相当于函数fun()已经被声明,就不需要头文件。而在日常的编程中,必须要添加头文件,否则很有可能报错

voltaile的用法

C语言丨深入理解volatile关键字 - 知乎 (zhihu.com)

C语言中volatile关键字的作用_c语言,static+volatile一起使用-CSDN博客

这篇文章从底层讲了 voltaile的由来,很不错。

然后是extern

C语言正确使用extern关键字-CSDN博客

C语言extern关键字用法和理解-CSDN博客

C语言中extern的用法_c语言extern-CSDN博客

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值