变量的存储类别 extern static atuo register
c语言中对象的概念就是内存,该块内存可以分配空间 也可以没有分配空间 都称之为对象
左值的概念是 指定对象的表达式 必须是指定内存上某个位置
变量的作用域
–块作用域
–函数作用域
–函数原型作用域:指的是函数原型中的形参
–文件作用域:也叫全局变量
变量的链接:
–外部链接:声明在所有函数外 int a;可以在其他翻译单元 中使用
–内部链接:声明在所有函数外,但是被static修饰 static int a;只能在当前翻译单元中使用
–无链接:声明在块内,仅当前块可以使用的变量
变量的存储期:
–静态存储期:程序执行期间一直存在,文件作用域的变量都为静态存储期
–线程存储期:以关键字_Thread_local 声明的对象
–自动存储期:块作用域的变量,局部变量
–动态分配存储期:动态分配的内存
函数与存储类别:
–外部函数:默认
–静态函数:static int func();
–内联函数:
ps:为了解决函数受限于当前文件时,用extern声明定义在其他文件的函数,这样做表明当前文件中使用的函数被定义在其他文件中。
几个关键字的介绍:
extern
作用是指明函数要使用外部变量,如果不实用extern,在函数内重新声明同名变量是一个新的变量
#include "stdio.h"int a;
int b;int fun()
{a = 2;printf("%p\n", &a);return 0;
}
int main(int argc, char const *argv[])
{extern int a; //这里的a是最上面全局变量int b; //这里的b是新创建的局部变量printf("%p\n", &a);fun();return 0;
}
运行结果
3
0x7ffe3e70220c
0x40402c
auto说明符表明变量是自动存储期,只能用于块作用域的变量声明中。由于在块中声明的变量本身就具有自动存储期,所以使用auto主要是为了明确表达要使用与外部变量同名的局部变量的意图
register 说明符也只用于块作用域的变量,它把变量归为寄存器存储类别,请求最快速度访问该变量。同时,还保护了该变量的地址不被获取
用 static 说明符创建的对象具有静态存储期,载入程序时创建对象,当程序结束时对象消失。如果static 用于文件作用域声明,作用域受限于该文件。如果 static 用于块作用域声明,作用域则受限于该块。因此,只要程序在运行对象就存在并保留其值,但是只有在执行块内的代码时,才能通过标识符访问。块作用域的静态变量无链接。文件作用域的静态变量具有内部链接
extern 说明符表明声明的变量定义在别处。如果包含 extern 的声明具有文件作用域,则引用的变量必须具有外部链接。如果包含 extern 的声明具有块作用域,则引用的变量可能具有外部链接或内部链接,这接取决于该变量的定义式声明
总结:
自动变量具有块作用域、无链接、自动存储期。它们是局部变量,属于其定义所在块(通常指函数)私有。寄存器变量的属性和自动变量相同,但是编译器会使用更快的内存或寄存器储存它们。不能获取寄存器变量的地址
具有静态存储期的变量可以具有外部链接、内部链接或无链接。在同一个文件所有函数的外部声明的变量是外部变量,具有文件作用域、外部链接和静态存储期。如果在这种声明前面加上关键字static,那么其声明的变量具有文件作用域、内部链接和静态存储期。如果在函数中用 static 声明一个变量,则该变量具有块作用域、无链接、静态存储期
具有自动存储期的变量,程序在进入该变量的声明所在块时才为其分配内存,在退出该块时释放之前分配的内存。如果未初始化,自动变量中是垃圾值。程序在编译时为具有静态存储期的变量分配内存,并在程序的运行过程中一直保留这块内存。如果未初始化,这样的变量会被设置为0
具有块作用域的变量是局部的,属于包含该声明的块私有。具有文件作用域的变量对文件(或翻译单元)中位于其声明后面的所有函数可见。具有外部链接的文件作用域变量,可用于该程序的其他翻译单元。具有内部链接的文件作用域变量,只能用于其声明所在的文件内。
变量的存储类别 extern static atuo register相关推荐
- c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...
7.7 变量的存储类别.作用域及生存期 1.变量的存储类别 在C语言中,有两类存储类别:自动类别及静态类别. 有4个与两种存储类别有关的说明符:auto(自动).register(寄存器).stati ...
- 【转载】变量的存储类别
转载自:http://edu.cnzz.cn/852996fd.html 一.动态存储方式与静态存储方式 上一节已介绍了变量的一种属性--作用域,作用域是从空间的角度来分析的,分为全局变量和局部变量. ...
- 存储过程debug值not a variable_C语言变量的存储类别
在程序中经常会使用到变量,在C程序中可以选择变量的不同存储形式,其存储类别分为静态存储和动态存储.可以通过存储类别修饰符来告诉编译器要处理什么样的类型变量,具体主要有自动(auto).静态(stati ...
- C语言中局部变量和全局变量 变量的存储类别
C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register) 局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用 ...
- C语言变量的存储类别和生存期
C语言变量的存储类别和生存期 我们知道,变量是有数据类型的,用来说明他占用多大的内存空间,可以进行什么操作. 除了数据类型,变量还有一个属性,称为"存储类别".存储类别就是变量在内 ...
- c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍
描述 C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动 ...
- 变量的存储类别以及作用空间
从变量值存在的时间角度划分,可以把变量划为静态存储空间和动态存储空间. 所谓静态存储空间是指在程序运行期间分配固定的存储空间的方式.而动态存储空间是在程序运行期间根据需要动态分配存储空间. 内存中供用 ...
- 【c语言】关键字存储类型讲解(auto,extern,static,register,const)
渣渣C的学习之路 用最简单的话,让你最快速明白! C语言中,每一个变量和函数都有2个属性:数据类型和数据的存储类别.C的存储类别有4种:自动的(auto).静态的(static).寄存器的(regis ...
- 动态内存分配及变量存储类别(第二部分)
5. C语言变量的存储类别和生存期 我们知道,变量是有数据类型的,用以说明它占用多大的内存空间,可以进行什么样的操作. 除了数据类型,变量还有一个属性,称为"存储类别".存储类别就 ...
- C++变量作用域、生存期、存储类别
写C.C++代码的小伙伴一定在头疼变量的作用域.生存期.存储类别问题.什么静态.外部.寄存器.局部.全局搞得一头雾水.今天咱们就来梳理一下他们的变态关系(什么不得了的事情???) 1.变量的作用域 说 ...
最新文章
- [推荐]Silverlight 2 开发者海报
- 剑指offer:机器人的运动范围
- Linux课程第十三天学习笔记
- 对于python中的self,cls,decorator的理解
- (多线程)leetcode1195. 交替打印字符串 最简单解法一个变量搞定
- C++安全方向(三)3.4 使用哈希列表验证文件的完整性
- spring 依赖注入_Spring从入门到入土——依赖注入(DI)
- matlab详细手册,matlab详细手册
- 数据库基础(常用SQL语句)
- psasp和matlab,MATLAB和PSASP电力系统潮流计算比较研究
- html显示时间,并且实时刷新(详细代码)
- python开发的网络调试助手_Linux/windows/mac 下的socket网络通信调试助手 UDP/TCP
- Spring JdbcTemplate 与 事务管理
- 自学C语言和C++,有什么好书推荐?
- 新增业务订单设计——产品形态随想
- WMS系统开发总结-移库管理-下架与上架
- GPRS优点介绍及GPRS上网相关知识(转)
- html中蝴蝶飞飞怎么制作,幼儿园小班《蝴蝶飞飞》教案
- CCI指标之预测范围以及CCI指标之预测分析
- 技术内幕 | StarRocks Community Champion、阿里云技术专家解读 Optimizer 实现