`

c++变量在内存中的存储区域

    博客分类:
  • C++
阅读更多
01 #include <iostream>
02
03 #include <string>
04 using namespace std;
05 int a = 0; // Initialization Area of Overall
06 char *p1; // Not Initialization Area of Overall
07
08 void main()
09 {
10 int b; // stack
11 char s[] = "abc"; // stack
12 char *p2; // stack
13 char *p3 = "123456"; // p3 in stack
14 static int c =0; // Initialization Area of Static Overall
15 p1 = new char[10];
16 p2 = new char[20];
17 strcpy(p1, "123456");
18 cout<<p1;
19 delete [] p1;
20 delete [] p2;
21 }
程序说明:
(1) 第5~6 行分别在函数体外部定义了两个变量a 和p1,它们存储在内存的静态存储区域。
(2) 第10~13 行定义的变量b、s、p2、p3 为局部变量,存储在内存的堆栈区。
(3) 第14 行定义的变量c 为静态局部变量,存储在内存的静态存储区域。
(4) 第17 行使用strcpy 函数,将字符串“123456”复制给指针变量p1 指向的存储单元。第18 行的输出结果为“123456”。
知识点:
(1) 当编译一个C++程序时,计算机的内存被分成了4 个区域:程序代码区、全局变量区、堆栈区和堆区。堆是自由的内存区域,可以通过new 和delete 把对象放在此区域,并可以在任何地方分配和释放自由存储区。
(2) C++中的变量可以分为全局变量、静态全局变量、静态局部变量和局部变量。其中,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
① 局部静态变量。在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
内存中的位置:静态存储区。
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非被显式初始化)。
作用域:作用域指变量的有效范围,当定义它的函数或者语句块结束时,作用域随之结束。
注意:当static 用来修饰局部变量时,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存中,直到程序结束,只不过不能再对它进行操作了。
② 全局静态变量。在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)。
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非被显式初始化)。
作用域:全局静态变量在声明它的文件之外是不可见的,准确地讲,是从定义处开始到文件结尾。
注意:当static 用来修饰全局变量时,它就改变了全局变量的作用域(在声明它的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区。
③ 静态函数。在函数的返回类型前加上关键字static,该函数就被定义成为静态函数。
函数的定义和声明默认情况下是 extern 的,但静态函数只在声明它的文件中可见,不能被其他文件所用。
④ 静态数据成员。
内存中的位置:静态存储区。
初始化和定义:
静态数据成员定义时要分配空间,不能在类声明中定义。
静态数据成员在程序中只能提供一个定义。静态数据成员的初始化不能在类的头文件中。
访问:
类实例名.静态数据成员
类类型名::静态数据成员
说明:
static 数据成员和普通数据成员一样遵循public,protected,private 访问规则。
对于非静态数据成员,每个类实例都有自己的备份。静态数据成员被当做类的全局对象,无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一个备份,由该类类型的所有对象共享访问。
同全局对象相比,使用静态数据成员有两个优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
静态数据成员可以实现信息隐藏。静态成员可以是 private 成员,而全局对象不可以。
静态数据成员的唯一性本质(独立于类的任何对象而存在的唯一实例),使它能够以独特的方式被使用,这些方式对于非static数据成员来说是非法的。
⑤ 静态成员函数。在类的成员函数返回值之前加上关键字static,它就被声明为一个静态成员函数。静态成员函数不能声明为const 或volatile,这与非静态成员函数不同。
定义:出现在类体外的函数定义不能指定关键字static。
作用域:主要用于对静态数据成员的操作。
静态成员函数与类相联系,不与类的对象相联系。
静态成员函数不能访问非静态数据成员,因为非静态数据成员属于特定的类实例。
静态成员函数没有this指针,因此在静态成员函数中隐式或显式地引用这个指针都将导致编译时刻错误。试图访问隐式引用this指针的非静态数据成员也会导致编译时刻错误。
访问:可以用成员访问操作符(.)和箭头(->)为一个类实例或指向类实例的指针调用静态成
员函数,也可以用限定修饰符名直接访问或调用静态成员函数,而无需声明类实例
分享到:
评论

相关推荐

    c_c++中内存区域划分大总结

    3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放 4.另外还有一个专门放常量的地方...

    C/C++程序内存的各种变量存储区域和各个区域详解

    C语言在内存中一共分为如下几个区域,分别是: 1.内存栈区:存放局部变量名; 2.内存堆区:存放new或者malloc出来的对象; 3.常数区:存放局部变量或者全局变量的值; 4.静态区:用于存放全局变量或者静态变量; 5....

    C++各变量的区别

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放。 4、...

    全局变量与局部变量在内存中的区别详细解析

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。 – 程序结束后由系统...

    踏入C++中的雷区C++内存管理详解

     (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。  (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,...

    C / C++ 各种 面试题 笔试题

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...

    深度探索C ++ 对象模型,内容概要:多态是一种威力强大的设计机制,允许你继承一个抽象的public接口之后,封装相关的类型,需要付出的代价就是额外的间接性--不论是在内存的获得,或是在类的决断上,C++通过class的pointer和references来支持多态,这种程序风格就称为"面向对象"。

     当编译一个C++程序时,计算机的内存被分成了4个区域,一个包括程序的代码,一个包括所有的全局变量,一个是堆栈,还有一个是堆(heap),我们称堆是自由的内存区域,我们可以通过new和delete把对象放在这个区域。...

    深度探索C++对象模型 chm

     当编译一个C++程序时,计算机的内存被分成了4个区域,一个包括程序的代码,一个包括所有的全局变量,一个是堆栈,还有一个是堆(heap),我们称堆是自由的内存区域,我们可以通过new和delete把对象放在这个区域。...

    C++学习代码(实例)

     (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。  (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,...

    堆内存和栈内存详解 ESP

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...

    c++的内存分配

    全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放文字常量区—常量...

    程序的内存分配

    3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...

    C/C++ 函数调用与函数返回值

     ·为获得数据参数及在函数体中声明的变量分配存储空间;  ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数。  当参数表为空时,表示该函数不从调用函数接受数据。  2、数值参数  ...

    关于堆栈、静态、动态内存的理解

    全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 文字常量区 —...

    预备知识―程序的内存分配

    的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的 另一块区域。 - 程序结束后有系统释放 4、文字常量区 ―常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区―...

    C++MFC教程

    在Windows中有各种GUI对象(不要和C++对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。 字体对象CFont用于输出文字时选用不同风格和大小的字体。可...

    最新名企标准通用C++面试题,

    1. 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。 2. 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些...

    C++中的栈和堆的区别

    3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、...

    c/c++程序内存空间浅说

     3、全局区(static):也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。...

Global site tag (gtag.js) - Google Analytics