zoukankan      html  css  js  c++  java
  • 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指针的非静态数据成员也会导致编译时刻错误。
    访问:可以用成员访问操作符(.)和箭头(->)为一个类实例或指向类实例的指针调用静态成
    员函数,也可以用限定修饰符名直接访问或调用静态成员函数,而无需声明类实例

     

  • 相关阅读:
    【T-SQL】分布抽取部分数据
    【Tip】如何让引用的dll随附的xml注释文档、pdb调试库等文件不出现在项目输出目录中
    【手记】F5调试报"由于缺少调试目标xxx无法开始调试xxx设置OutputPath和AssemblyName"
    【手记】未能从程序集System.Net.Http.Formatting中加载类型System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
    摄影基础知识入门
    测试开发进阶必备(附源码)---Dubbo 接口测试技术
    App自动化之dom结构和元素定位方式的详细内容(不看后悔)
    接口自动化测试 | JsonPath 与 Mustache 请求传参的模板化技术
    一文搞定自动化测试框架 RESTAssured 实践(三):对 Response 结果导出
    一文搞定 REST Assured 实践(二):断言实现
  • 原文地址:https://www.cnblogs.com/hao02171990/p/3266195.html
Copyright © 2011-2022 走看看