(c++)局部(全局)、常量(变量)、静态变量在内存中的存放位置

news/2024/10/18 9:24:11/

//内存四区:1.代码区   2.全局区  3.栈区  4.堆区

1.放在代码区的有:1.写的代码
2.放在全局区的有:1.全局的(变量或常量)  2.静态的(变量或常量)  3.字符串常量
3.在栈区的有:1.局部的(变量或常量)

注:1.函数形参也是局部的 2.main()函数内创建的变量也是局部变量

3.对于一个局部变量指针,若它指向的空间在栈区,不要返回这个指针。由于变量是局部变量,函数结束后局部变量的就自动释放了,这块地址上的空间你也不能再操作了,除非你返回的这个地址在堆区。

对于一个局部变量指针,若它指向的空间在堆区,可以返回这个指针。虽然函数结束后这个指针同样会被释放,但是已经将地址传递出去了,并且由于他的地址在堆区所以虽然函数结束了但是这块空间依然能够被操作。

以上两种情况下在函数内创建的指针,在函数结束后都被释放了,只不过前者返回出来的地址不能用了,后者返回出来的地址仍然可以操控。

关键在于:指针指向的地址空间在栈区还是堆区,在栈区则不要返回(返回了也不能操纵,这块空间,因为编译器自动释放了)、在堆区则可以。

4.放在堆区的有:利用new创建的数据。

创建的操作为:

int* p2 = new int(10);

    //new int(10)代表开辟一个堆区的空间并且赋值为10,整个表达式会返回这个空间的地址。
    //int* p创建一个指针p。
    //int* p=new int(10)  用创建的这个指针p来接收new int(10)返回的地址
    

代码在干嘛?在创建各种变量、常量、局部的、全局的、静态的,然后访问他们的内存地址。

#include<iostream>
using namespace std;//内存四区:1.代码区  2.全局区  3.栈区  4.堆区
//1.放在代码区的有:1.写的代码
//2.放在全局区的有:1.全局的(变量或常量)  2.静态的(变量或常量)  3.字符串常量
//3.在栈区的有:1.局部的(变量或常量),程序员创建,编译器自动释放
//4.放在堆区的有:1.new开辟的空间,由程序员创建和释放(整个程序运行完了也会自动释放)//全局变量
int g_a = 0;
int g_b = 0;//const修饰的全局变量
const int c_g_a = 0;
const int c_g_b = 0;//static修饰的全局变量
static int s_g_a = 0;
static int s_g_b = 0;int* fun1()
{int a = 10;int* p1 = &a;return p1;
}//利用new将数据放在堆区
int* func2()
{//new int(10)代表开辟一个堆区的空间并且赋值为10,整个表达式会返回这个空间的地址。//int* p创建一个指针p。//int* p=new int(10)  用创建的这个指针p来接收new int(10)返回的地址int* p2 = new int(10);return p2;
}int main()
{//全局变量cout << "全局变量g_a的地址为:\t\t" << (int)&g_a << endl;cout << "全局变量g_b的地址为:\t\t" << (int)&g_b << endl;//静态变量 在普通变量前面加static,属于静态变量static int s_a = 0;static int s_b = 0;cout << "静态局部变量s_a的地址为:\t" << (int)&s_a << endl;cout << "静态局部变量s_b的地址为:\t" << (int)&s_b << endl;//cout << "静态全局变量s_g_a的地址为:\t" << (int)&s_g_a << endl;cout << "静态全局变量s_g_b的地址为:\t" << (int)&s_g_b << endl;//常量分为1.字符串常量2.const修饰的变量cout << "字符串常量的地址:\t\t" << (int)&"hello world" << endl;//const修饰的变量:1.修饰全局变量  2.修饰局部变量cout << "全局常量c_g_a的地址为:\t\t" << (int)&c_g_a << endl;cout << "全局常量c_g_b的地址为:\t\t" << (int)&c_g_b << endl;//修饰局部变量cout << endl;const int c_l_a = 0;const int c_l_b = 0;cout << "局部常量c_l_b的地址为:\t" << (int)&c_l_a << endl;cout << "局部常量c_l_b的地址为:\t" << (int)&c_l_b << endl;//创建普通局部变量int a = 0;int b = 10;cout << "局部变量a的地址为:\t" << (int)&a << endl;cout << "局部变量b的地址为:\t" << (int)&b << endl;cout << endl;//读取指向栈区空间指针的值(不能正常读取,部分编译器第一次可以正常读取,之后便不行了)cout << "第一次读取指向栈区空间的指针的值:" << *fun1() << endl;cout << "第二次读取指向栈区空间的指针的值:" << *fun1() << endl;cout << endl;//读取指向堆区空间指针的值cout << "第一次读取指向堆区空间的指针的值:" << *func2() << endl;cout << "第二次读取指向堆区空间的指针的值:" << *func2() << endl;system("pause");return 0;
}

代码运行截图:

显然:

1.只要是带“全局”或者“静态”的都在一起,还有字符串常量也是。

2.只要是带“局部”的也都放在一起。

3.若局部变量指针指向的地址在栈区,则无法访问

4.若局部变量指针指向的地址在堆区,则能够正常访问


http://www.ppmy.cn/news/1532662.html

相关文章

TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用

TMS320F280025 模数转换器ADC原理分析与应用 ` 文章目录 TMS320F280025 模数转换器ADC原理分析与应用逐次比较型ADC和双积分型ADC工作原理逐次比较型 ADC双积分型 ADC280025ADCADC原理分析ADC时钟SOCSOC内部原理ADC触发方式ADC采集(采样和保持)窗口通道寄生电容基准电压发生器模…

ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

自动化学习1:pytest自动化框架的基本用法:注意事项/断言assert/测试结果分析

一.注意事项&#xff1a; ①创建test开头的文件&#xff08;test_&#xff09;/类/函数或方法 ②pytest中以每一个函数或方法&#xff0c;作为用例 ③pytest启动方式&#xff1a;pytest def test01(): # 函数&#xff08;写在类外边是函数&#xff09;passclass Test:def t…

CSV数据行(取值)的列数多于表头字段数-Pandas无法正常读取

CSV数据行(取值)的列数多于表头字段数-Pandas无法正常读取 问题描述&#xff1a;在使用Pandas正常读取csv文件时&#xff0c;报错提示“ ParserError: Error tokenizing data. C error: Expected 460 fields in line 3363, saw 472”。也就是数据行的值个数多于表头字段个数。…

Linux指令收集

文件和目录操作 ls: 列出目录内容。 -l 显示详细信息。-a 显示隐藏文件&#xff08;以.开头的文件&#xff09;。cd: 改变当前工作目录。 cd ~ 返回主目录。cd .. 上移一级目录。pwd: 显示当前工作目录。mkdir: 创建目录。 mkdir -p path/to/directory 创建多级目录。rmdir: 删…

【递归】6.LPC 44 开幕式火焰

1 题目描述 题目链接&#xff1a;开幕式火焰 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…

Python3 爬虫教程 - Web 网页基础

Web网页基础 1&#xff0c;网页的组成HTMLcssJavaScript2&#xff0c;网页的结构 3&#xff0c;节点树及节点间的关系4&#xff0c;选择器开头代表选择 id&#xff0c;其后紧跟 id 的名称。如&#xff1a;div 节点的 id 为 container&#xff0c;那么就可以表示为 #container 1…

监控告警功能详细介绍及操作演示:运维团队的智能保障

在当今这个信息化高速发展的时代&#xff0c;运维团队面临着前所未有的挑战。为了确保系统的稳定性和高效运维&#xff0c;监控告警功能成为了运维团队不可或缺的得力助手。本文将详细介绍我们的监控告警功能&#xff0c;并结合实际操作页面进行演示&#xff0c;帮助运维团队更…