C++ 变量声明 定义 作用域 链接性总结
变量定义
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
变量声明
用于向程序表明变量的类型和名字。程序中变量可以声明多次,但只能定义一次。
变量的类型
(1)自动存储变量: 在函数定义中声明的变量(包括函数参数)。当函数或代码块执行时创建变量,当函数或代码块执行完时,这些变量的内存被释放。这类变量在 栈 中分配内存。
(2)静态持续变量: 在函数定义外定义的变量和使用关键字 static 定义的变量,简称 静态变量。这类变量在程序整个运行过程中都存在
(3)动态存储变量: 由 new 运算符分配内存的变量,直到使用delete运算符将其释放或程序结束。这类变量在 堆(自由存储区) 中分配内存。
(4)线程存储变量: 此变量生命周期和线程一样长。这里不做过多解释。
5种变量储存方式
| 存储描述 | 持续性 | 作用域 | 链接性 | 如何声明 |
|---|---|---|---|---|
| 自动 | 自动 | 代码块 | 无 | 在代码块中 |
| 寄存器 | 自动 | 代码块 | 无 | 在代码块中,使用关键字 register |
| 静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中,使用关键字 static |
| 静态,外部链接性 | 静态 | 文件 | 外部 | 不在任何函数内 |
| 静态,内部链接性 | 静态 | 文件 | 内部 | 不在任何函数内,使用关键字 static |
述了名称在文件的多大范围内可见。
(1)全局作用域:从变量定义到文件结尾都可用,所以也叫 文件作用域。
(2)局部作用域:如自动变量的作用域在函数内部。
链接性
(1)外部链接性:可在其它文件中访问。
(2)内部链接性:只能在当前文件中访问。
(3)无链接性:只能在当前函数或代码块中访问。
静态持续变量初始化
(1)如果没有显示的初始化静态变量,编译器将把它设置为0
(2)在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0
例:
int global = 1000;
static int one_file = 50;
int main()
{
...
}
void fun(int n)
{
static int count = 0;
int llama = 0;
...
}
分析:global和one_file的作用域都为整个文件,global的链接性为外部,所以可以在程序的其他文件使用它,而 one_file的链接性为内部,只可以在本文件中使用它。(程序是多文件)
count和llama作用域是局部的,没有链接性,也就是说只能在fun()中用它们。因为count变量是静态变量,所以count变量一直存在,即使fun()函数没有执行。而llama变量是当fun()函数执行时被创建,当fun()函数执行完后被释放内存。
多文件使用外部链接性变量
只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使用关键字 extern 声明它。
例:
//file1.cpp
int cat = 20; //在file1.cpp中定义cat变量
//file2.cpp
extern cat; //在file2.cpp中使用cat变量要先用extern声明
cout << cat << endl;
结束
现在读者应该对变量有了更深刻的认识了
C++ 变量声明 定义 作用域 链接性总结的更多相关文章
- javascript变量声明及作用域总结
javascript变量声明及作用域总结 一.总结 一句话总结:还是得好好看书,光看视频是不得行的,浅学无用,要相互印证,要真正理解才有用,比如<Javascript权威指南> 书 1.j ...
- javascript变量声明 及作用域
javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...
- C++11 变量和函数的链接性
在全局变量前添加const或者static,则该变量链接性为内部,即文件内有效.可以使用extern声明为外部. 如果要让函数的链接性为内部,则函数声明和定义都应使用static关键字. 例子: te ...
- 【转】javascript变量声明 及作用域
javascript变量声明提升(hoisting) javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看 ...
- 浅谈javascript函数,变量声明及作用域
javascript函数跟变量的声明.作用域这些概念网上都已经讲烂了. 这里写个博客,也相当于做个笔记. 变量声明 首先看个例子: var globalVar = "gv"; fu ...
- javascript 变量声明 和 作用域
变量的声明 1.变量声明具有提升机制,Javascript在执行时,会把所有的声明都提升到当前作用域前面. 先看一下下面的例子: (function(){ alert(b)//b is not def ...
- Typescript学习笔记(三)变量声明及作用域
ts的变量声明有var,let和const,这尼玛完全跟es6一样嘛.就稍微介绍一下. 大多数js开发者对于var很熟悉了,原生js里没有块级作用域,只有函数作用域和全局作用域,还存在var的变量提升 ...
- 关于js中变量声明和作用域的理解
1. var是声明一个变量:虽然声明了这个变量,但在存入值之前,它的初始值是 undefined:2.全局变量:拥有全局作用域,在js代码中的任何地方都是有定义的:3.局部变量:在函数内声明的变量只在 ...
- C++ 多文件编译简述:头文件、链接性、声明与定义
目录 Commen Sense 头文件 链接性 static 与链接性控制 extern 与外部链接性 Reference Commen Sense C++ 在编译时对每个翻译单元(Translati ...
随机推荐
- 一文让你彻底理解SQL关联子查询
员工表的主要信息: 需求:检索工资大于同职位的平均工资的员工信息. 直觉的做法 员工多,而相应的职位(如销售员.经理.部门经理等)少,因此首先想到的思路是对职位分组,这样就能分别得到各个职位的平均工资 ...
- P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】
正题 题目链接:https://www.luogu.com.cn/problem/P7294 题目大意 \(n\times m\)的网格,当你在\((x,y)\)时你有两种选择 花费\(x^2\)的代 ...
- join方法个人理解
首先抛出对join的疑问 如果我有一个a线程,一个b线程 那此时 a.start(); b.start(); a.join(); b.join(); 是否意思是a线程先执行完,然后再执行b线程; 如果 ...
- 【理解OS】1.保护模式概述
这个系列文章主要目的是为了记录我个人学习保护模式后的总结与一点点的思考.我也是一个学习者,其中由错误在所难免,若各位朋友指出将不胜感激. 1. Intel CPU的运行模式概述 这里我将粗略介绍Int ...
- 跳表--怎么让一个有序链表能够进行"二分"查找?
对于一个有序数组,如果要查找其中的一个数,我们可以使用二分查找(Binary Search)算法,将它的时间复杂度降低为O(logn).那查找一个有序链表,有没有办法将其时间复杂度也降低为O(logn ...
- oracle 不能用上下键调用sql语句
在Linux的sqlplus中运行SQL语句之后,想用上下键把历史命令找出来,发现不支持. 安装rlwrap 重启sqlplus 3,使用rlwrap,rlwrap sqlplus / as sysd ...
- 从零开始学算法---二叉平衡树(AVL树)
先来了解一些基本概念: 1)什么是二叉平衡树? 之前我们了解过二叉查找树,我们说通常来讲, 对于一棵有n个节点的二叉查找树,查询一个节点的时间复杂度为log以2为底的N的对数. 通常来讲是这样的, 但 ...
- redis在微服务领域的贡献
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 前言 说到redis,可能大家的脑海中蹦出的关键词是:NoSQL.KV.高性能.缓存等.但今天 ...
- 洛谷3244 落忆枫音 (拓扑图dp+式子)
题目大意就是 给你一个DAG 然后添加一条边\(x->y\) ,询问以1为根的生成树的个数 QWQ 首先假设没有添加的边 答案就应该是 \[ans=\prod_{i=1}^{n} in[i] \ ...
- vps实现私人代码托管并用nginx部署hexo
个人博客 原本我的博客是通过github pages搭建的,但由于一些众所周知的原因,即使套上了CDN依旧是访问状态令人堪忧,经常会造成各种各样的问题,并且由于不存在服务器也不好进行进一步的管理,更不 ...