static局部变量(静态局部变量)局部全局变量
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在C语言中,对变量的存储类型说明有以下四种:
auto 自动变量 (动态存储)
register 寄存器变量(动态存储)
static 静态变量(静态存储)
extern 外部变量(静态存储)
前三个是局部变量的存储类型,最后一个extern是全局变量的存储类型。
所谓存储类型是指变量占用内存空间的方式,也称为存储方式。
这4种类型 不允许重复定义 如: extern static int a=200;是错误的;只能指定一中存储类型;如;static int a =200;或者是 extern int a;
变量的存储方式可分为“静态存储”和“动态存储”两种。
静态存储变量:在定义时候存储单元里一直保持不变;直到程序结束。
动态存储变量:在程序执行时候;使用他的时候才分配内存单元,使用完毕后立即释放,再使用在分配。
从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
static的用法
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C语言中extern的用法
1.在一个文件内扩展外部变量的作用范围
2.将外部变量的作用域扩展到其他文件(在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同)。
3.将外部变量的作用域限制在本文件中。
注意,extern不可以扩展局部变量的作用域范围,因为本文最前面就说了,extern是全局变量的存储类别。
代码实例1:
#include <stdio.h>
int main()
{
extern a; //利用extern扩展局部变量a的范围
int my_num = 7;
printf("%d\n%d",my_num,a);
return 0;
}
void my_func()
{
int a=8; //定义局部变量
printf("%d",a);
}
效果:
代码实例2:
#include <stdio.h>
int main()
{
extern a; //利用extern扩展全局变量范围
int my_num = 7;
printf("%d\n%d",my_num,a);
return 0;
}
int a=8; //定义全局变量
void my_func()
{
printf("%d",a);
}
效果:
-------------------------------------------------------------------------------------------------------------------------------------------------------------
声明和定义的区别
声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。
而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。
extern int i; //是声明,不是定义,没有分配内存
int i; //是定义
如果在声明的时候给变量赋值,那么就和去掉extern直接定义变量赋值是等价的
extern int a = 10;//尽量不要写这种定义方式
int a = 10;//上述两条语句等价
总之就是:把建立空间的声明成为“定义”,把不需要建立存储空间的成为“声明”。
谨记:声明可以多次,定义只能一次
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
extern作用于函数名和变量名时的区别:
extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。
读者应该会发现,函数声明时并没有使用 extern 关键字,这是因为,函数的定义有函数体,函数的声明没有函数体,编译器很容易区分定义和声明,所以对于函数声明来说,有没有extern 都是一样的
但是作用于变量名时extern关键字就不是可有可无的了,全局变量在外部使用声明时,extern关键词是必须的,如果变量无extern修饰且没有显式的初始化,就成为了变量的定义,因此此时必须加extern,
定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。c语言中只有局部变量在未赋初值时,才是随机数,全局变量和静态变量未赋初值时编译器会自动将其初始化为0。局部变量是分配在堆栈上的,而全局变量和静态变量是分配在数据段中的。这个跟程序的内存分配是有关系的。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
局部变量详解
花括号详解
在 C 中, {}用与分隔代码块
。左花括号和右花括号分别表示块的开始和结束。
花括号内定义的变量就只在本域(就是这个大括号)内有效,而且不会影响其他域,即使名字相同,所以局部变量的变量名可以相同,他们是互不影响的。
全局变量和局部变量,C语言是就近原则。
代码实例:
#include <stdio.h>
int main()
{
int my_num = 7;
{
int new_num = 10;
}
printf("new_num is %d",new_num); //this is line 9
return 0;
}
效果:
Line Message
9 error: 'new_num' undeclared (first use in this function)
这是因为变量 new_num
是在代码块内部声明的,其作用域仅限于代码块内部。换句话说,它对于代码块内部是本地的,不能从代码块外部访问。
基于上述观察,让我们写下以下变量局部作用域的通用原则:
{
/*OUTER BLOCK*/
{
//此块开始之前的代码块外部的内容
//可以在这里被访问
/*INNER BLOCK*/
}
//此处无法访问代码块内部的内容
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
运行结果:7 8 9
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
看了下面几篇文章就对局部变量和全局变量搞懂了:
C语言全局变量和局部变量(带实例讲解)
C语言形参和实参的区别(非常详细)
C语言:扩展或限制全局变量、函数作用域方法
C 语言中的变量作用域——局部和全局作用域
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇
· 易语言 —— 开山篇