关于变量的一些笔记
来源:互联网 发布:衣阿华 知乎 编辑:程序博客网 时间:2024/06/06 00:47
一、局部变量和全局变量
从空间角度,也就是作用域角度,变量可以分为局部变量和全局变量。
1.局部变量
是在一个函数内部定义的变量,只能在本函数范围内有效。
2全局变量
是在函数外定义的变量,也叫外部变量。主要作用是增加函数之间的数据联系渠道,如果一个函数改变了全局变量的值,就能够影响到其他函数,使其他函数中引用的同名变量也同时改变。
全局变量要尽量避免。因为它有一些缺点:
- 占用全局数据区。在程序全部执行过程中都要占用存储单元,而不是仅仅在需要时才开辟存储单元
- 降低通用性,程序是要低耦合的。如果将某个函数移到另一个文件中,还要将相关的外部变量一起移植过去。
- 若与局部变量重名,则在局部变量范围内,全局变量被屏蔽。
二、变量的存储方法
根据变量的存储期(存在的时间)不同,可以分为静态存储和动态存储。
1.静态存储
在程序运行期间,系统对变量分配固定的存储空间。主要存放全局变量,static声明的静态局部变量。
2.动态存储
在程序运行期间,系统对变量动态分配存储空间。主要存放形参,函数中定义的变量(未static声明的局部变量),函数调用时的现场保护和返回地址。这个存储区分为堆和栈,一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。
三、变量的存储类别
主要有四种类别:自动(auto),静态(static),寄存器(register),外部(extern)
1.自动变量
函数中的局部变量,且未加static声明的,是动态分配存储空间,auto可以省略。如果没有初始化的话,则是一个不确定的值。
#include <iostream>using namespace std;int main(){ int a; cout << a << endl; system("pause"); return 0;}
a为auto自动变量,且auto可以省略。可以看到运行结果是:
2.静态局部变量
使用static声明的局部变量,其值在函数调用后不消失而保留原值,其占用的存储单元不释放。主要特点:
- 在静态存储区分配内存。
- 在程序首次执行到该对象的声明处时被初始化。
- 若不赋初始值,编译器自动赋值为0(数值型)或者NULL(字符型)
- 虽然在函数调用后还存在,但是其他函数不能引用他,也就是对其他函数内不可见。
#include <iostream>using namespace std;int main(){ static int a; cout << a << endl; system("pause"); return 0;}
这个例子在上个例子的基础上加上了static,a变成了静态局部变量,被编译器初始化为0,运行结果为0。
3. 寄存器变量(register声明)
我们知道计算机有存储结构,是在速度和成本的折中。CPU运算单元从寄存器取数据要快于存主存中取数据。用register声明的寄存器变量适合需要频繁存取的场合。不过现代编译系统能够自动识别使用频繁的变量,放到寄存器中。
int fun(int n){ register int i, f =1; for (i = 1; i <= n; i++) f = f*i;}
其中i 和f 为寄存器变量。
4.用extern声明的外部变量
主要作用:如果一个程序包含两个文件,两个文件中都要用到同一个外部变量,可以在任意一个文件定义外部变量X,在另一个文件中用extern对外部变量作声明:extern X
**注意:**extern只是用作声明,不是用作定义,只是对一个已经定义的外部变量作声明,以扩展其作用域。
5.用static声明的外部变量
主要作用:保证该外部变量只能在本文件中引用,而不能被其他文件引用。
注意:加不加static声明的外部变量都在静态存储区存储。
在b.cpp 文件中有一句代码:
static int a = 3;
在a.cpp中有如下代码:
#include <iostream>using namespace std;extern int a;int main(){ cout << a << endl; system("pause"); return 0;}
虽然在a.cpp中加了extern,还是不能引用a,会在链接时候出现错误:
对于static,在c++的类里还有很重要的应用。下次空了再继续整理。
- 关于变量的一些笔记
- 【学习笔记】关于变量类型的一些知识
- 关于变量初始化的一些测试
- 关于变量的一些基本认识01
- 关于const类型变量的一些知识
- *关于函数中的一些变量的时效性*
- 关于字符变量的一些总结
- 关于全局变量,局部变量的一些看法!!!
- C++关于局部变量的一些理解
- 关于shell脚本变量的一些知识
- 关于ROUTER的一些笔记
- 一些关于java的笔记
- 一些关于字符串的笔记
- 关于指针的一些笔记
- 关于"表达式"的一些笔记
- 关于JDBC的一些笔记
- 关于Spring的一些笔记
- 关于范式的一些笔记
- java访问修饰符
- 云图开发
- 基本数据类型
- 用tensorflow训练自己的图片集-用TFRecords将代码导入神经网络
- java中的 switch语句
- 关于变量的一些笔记
- Java中的集合类
- Matlab中meshgrid的用法
- 华为OJ——无线OSS-高精度整数加法
- 旋转数组
- Linux的sed命令详解
- uva 10763 Foreign Exchange
- 素数距离问题
- digitalocean使用Python简易ftp服务器