• 【C++ 学习】链接、作用域、内存管理


    链接、作用域、内存管理

    存储类别

    int num = 3;
    
    • 1

    该声明创建了一个名为num的变量,变量值为3,num是这个变量的名字,也就是标识符。标识符是一个名称,一个合法的标识符必须以字母或者下划线(_)开头,其组成可以由字母,下划线和数字组成。
    num变量是一个存储在内存中的变量。也就是说,num在内存中实际占用一定的物理内存,C语言把这样一块内存称为对象。
    存储期:是指对象在内存中保留了多长时间。(即这块内存的可使用时长)。
    标识符可以用来访问这样一个内存,可以用作用域、链接描述标识符,标识符的作用域和链接表明了程序的哪些部分可以使用它。

    作用域

    作用域用来描述程序中可以访问某个标识符的区域。
    作用域的大小包括块作用域、函数作用域、函数原型作用域和文件作用域。

    for (int i; i < 15; i ++){
    	int n = 10;
    	...;
    	...;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    for循环中,i的作用域就是块作用域,变量n的作用域也是块作用域,即在这个块中,i和n是可用的,在这个块外面,如果再存在i或n,则两者是不同的。while块、do while块、if和else语句块都是块作用域。
    函数作用域仅用于goto语句。
    函数原型作用域的范围是从形参定义处到原型声明结束。

    int add(int a, int b);
    
    • 1

    这就是一个函数声明。
    文件作用域,变量定义在文件开头(也不一定非得在开头,不过一般都写在开头)并在所有函数的外面。

    #include 
    int count = 0;
    int main(void){
    	...;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里面的count变量就是文件作用域变量,即count可以在所有函数中使用。文件作用域变量也成为全局变量
    局部变量: 块作用域的变量,函数原型作用域变量,函数作用域变量都是局部变量。这意味着,这些变量只能在指定区域使用。但是,如果全局变量与局部变量重名,且在该块中存在一个同名局部变量,块优先使用局部变量。

    #include 
    
    using namespace std;
    
    int count = 0;
    
    int main(void){
    	count ++;
    	cout<< "count = " << count << endl;
    	example();
    	cout<< "count = " << count << endl;
    	return 0;
    }
    voud example(void){
    	int count = 15;
    	cout << "example count = " << count <
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    开头的count = 0,就是一个全局变量,example函数中count = 15,就是一个局部变量。

    链接

    C变量具有3种链接属性:外部链接、内部链接和无链接。
    == 具有块作用域、函数作用域、函数原型作用域的变量(局部变量)都是无链接变量。==

    具有文件作用域(全局变量)可以是外部链接或内部链接。

    存储期

    存储期描述了通过这些标识符访问的对象的生命期。 C对象共有四种存储周期:静态存储期、线程存储期、自动存储期和动态分配存储期。
    静态存储期的存储时间最长,如果某一个变量具有静态存储期,则它在程序的执行期间会一直存在。文件作用域的变量(全局变量)具有静态存储周期。
    线程存储期、自动存储期、动态分配存储期一般都不具有全局的生命周期(除非使用static限定的变量),它们是随着线程、块、动态空间分配函数的分配作用域来决定的。

    静态变量

    简单地来说就是使用static进行限定的变量和全局变量。静态的意思是,该变量一经声明定义(静态变量声明的同时必须进行定义)在内存中拥有一块存储区域后,就会一直在该块内存中,直到程序执行结束。其变量值可以改变,但是物理内存不会改变。
    函数中声明定义的静态变量,具有静态存储周期,但是作用域仅是块作用域,不是全局作用域。也就是说,函数执行结束后,该变量的内存不会被释放,但其他函数也无法使用该变量

  • 相关阅读:
    问题: 视频颜色问题,偏绿
    自学Python06-学会Python中的while循环语句
    100个测试参与的项目如何高质量完成
    【调研】在线考试系统调研
    HTTP协议概述
    前端进击笔记第五节 JavaScript 如何实现继承?
    思腾云计算
    [AI Agent学习] MetaGPT源码浅析
    JSON.stringify()和JSON.parse()的使用
    如何从0到1快速选出抖音爆品?选品门路有诀窍!
  • 原文地址:https://blog.csdn.net/weixin_43571647/article/details/133981547