7、变量的生存期和作用域

简介:      在C语言中,程序可在任意花括号后定义变量,在C++中,允许在程 序中任何地方声明变量,它的优点是可在使用该变量附近定义他。当在一个块内定义了一个变量,这个变量的作用域是从定义点起到当前块的结束以及所有在当前块 中出现的子块。

     C语言中,程序可在任意花括号后定义变量,C++中,允许在程 序中任何地方声明变量,它的优点是可在使用该变量附近定义他。当在一个块内定义了一个变量,这个变量的作用域是从定义点起到当前块的结束以及所有在当前块 中出现的子块。  

作用域:变量名有效的范 围。
      生存期:变 量在程序中存在的时期(全局,局部两种)。
      存储方式:auto, register, extern, static
      存储空间类 型: 栈(stack):自动分配和清除的变量。如:局部变量和函数参数等堆(heap):由malloc等函数分配的空间。(在c++里这叫自由存储区,而把new得来的空间叫做堆)
      全局/静态存储区:存储全局变量和静态变量。全 局区(静态区)-全局变量和静态变量的存储是放在一块的, 初 始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静 态变量在相邻的另一块区域。 程序结束释放。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局 区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另 外,函数中的"adgfdf"这样的 字符串存放在常量区。

比如,

int a = 0; //全局初始化 区

char *p1; //全局未初始化 区

main()

{

int b; //

char s[] = "abc"; //

char *p2; //

char *p3 = "123456"; //123456\0在常量 区,p3在栈上。

static int c = 0; //全局(静态)初始化 区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

//分配得来得1020字节的区域就在堆区。

strcpy(p1, "123456");

//123456\0放在常量 区,编译 器可能会将它与p3所 指向的"123456"优化成一块。

}

再如:

void main()

{

   if(true)

     {

          staic int a = 10;

      }

  .....

}

因为被声明为一个静态变 量,它的生存期就是全局的,也就是main函数结束时才销毁,但是由于是在if语句里面声明的,作用域就只是if后面大括号包含的,外面就不能访问。

图示如下:

img_e36119ab1794aa5c8e764a52e15390c6.png


目录
相关文章
|
6月前
|
编译器 C++
c++关于命名空间内变量和函数及全局变量的使用和作用域
c++关于命名空间内变量和函数及全局变量的使用和作用域
114 1
|
1月前
静态局部变量的作用域是怎样的
静态局部变量的作用域仅限于声明它的函数内部,但其生命周期贯穿整个程序运行期,初始化仅在第一次进入函数时进行。
|
1月前
|
自然语言处理 JavaScript 前端开发
词法作用域和静态作用域有什么区别
【10月更文挑战第12天】词法作用域和静态作用域有什么区别
|
6月前
|
存储 程序员 C++
C++程序局部变量:生命周期与作用域的探讨
C++程序局部变量:生命周期与作用域的探讨
124 1
|
4月前
|
存储 Java 测试技术
day8:变量、常量及其作用域
【7月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
38 0
|
6月前
|
JavaScript 前端开发 Python
函数与作用域
编程中的函数与作用域概念。函数是可重用的代码块,能提高代码的可读性、可维护性和复用性。基础用法包括定义、调用和返回值。高级用法涉及函数嵌套、匿名函数(lambda函数)和装饰器。装饰器能在不修改原函数代码的情况下添加功能。 作用域决定了变量的可见范围,从内到外是局部、嵌套、全局和内置作用域。闭包是能访问外部函数变量的内部函数,即使外部函数执行完毕,闭包仍能保留其状态。闭包常用于实现特殊功能,如记忆化和延迟执行。 立即执行函数表达式(IIFE)是JavaScript中的模式,用于创建私有作用域和防止变量污染全局。IIFE常用于封装变量、避免命名冲突以及实现模块化和函数作为参数传递。
|
存储 C语言 C++
函数的内部处理及全局变量和局部变量
函数的内部处理及全局变量和局部变量
125 0
函数的内部处理及全局变量和局部变量
|
Linux 网络架构
暂时性死区以及函数作用域
暂时性死区以及函数作用域
175 0