const,static总结

本文详细介绍了内存的栈、堆、静态区和常量区的使用及特点,探讨了const和static在不同场景下的作用。const变量根据存储位置有不同的修改规则,全局const变量不可修改。static用于限制变量的作用域或生命周期,静态成员变量为类所有对象共享。理解这些概念对于优化程序内存管理和提升代码质量至关重要。
摘要由CSDN通过智能技术生成

概览

内存大概图

注意
上图中的char_v字符数组是存储在栈上的,char_v是首元素地址解引用,为‘a’同样是在栈上(注意区分ptr_char_v和*char_v)

:(向下)
函数调用建立栈帧,参数,函数中的局部变量都存在栈帧中

:(向上)
malloc,realloc,calloc,new,new[]出来的都在堆上
理论上而言,后malloc的内存地址比先malloc的大,但不一定,因为下一次申请的空间可能是之前释放的

数据段(静态区)
通常用来存放程序中已初始化的(非 0)全局变量和静态局部变量。数据段的起始位置由链接定位文件确认,大小在编译链接时自动分配。数据段属于静态内存分配
静态区3点作用static,全局

  1. 静态全局变量只能在本变量的源文件中使用
  2. 存储在静态数据区的变量(全局变量静态变量)会在程序刚开始运行时就完成初始化,也是唯一的一次初始化,下图为例子
    在这里插入图片描述
  3. 在静态数据区,内存中所有的字节默认值都是0x00
    在这里插入图片描述

按作用域

  1. 全局变量:在整个工程文件内都有效
    main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和全局变量一样长而已,全局变量一定是定义在函数外部的)
  2. 局部变量:局部变量的作用域是定义该变量的函数或定义该变量的复合语句
  3. 静态全局变量:只在定义它的文件内有效
  4. 静态局部变量:只在定义它的函数内有效,且程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效

按存放位置

  1. 全局变量:静态区
  2. 局部变量:栈
  3. 静态全局变量:静态区
  4. 静态局部变量:静态区

static的作用
在C中:

  1. 修饰全局变量和全局函数,改变链接属性,只在当前文件可见,其他文件不可使用
  2. 修饰局部变量,改变生命周期,局部变为全局

在C++中:

  1. C++兼容C中的属性
  2. 修饰成员变量和成员函数,成员变量属于整个类,所有对像共享,成员函数没有this指针

static成员特性

  1. 静态成员变量为所有类对象所共享,不属于某个具体的对象,放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,如:int A::_count = 0;
    (分析静态成员变量在全局位置定义初始化,因为每实例化一个对象,构造函数就去初始化一次并不合理,static变量只用初始化一次)
  3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问
  4. 静态成员函数没有隐藏的this指针不能访问任何非静态成员
    参考:C++初阶—类和对象(入门)的this指针部分
  5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

const按存放位置 const对变量的存放位置没有影响


const变量通过指针修改(两种情况)

  1. 对于局部const变量是可以通过指针来修改的
    对于gcc编译器:编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10在这里插入图片描述
    对于vs编译器:会打印出修改后的值
    在这里插入图片描述
    在这里插入图片描述

  1. 对于全局const变量不可以通过指针来修改
    在这里插入图片描述

结论

  1. const局部变量存储在堆栈中,可通过指针修改其值
  2. const全局变量存储在全局存储空间(代码段),其值只有可读属性,不能修改

代码段
代码段在内存中被映射为只读。它是由编译器在编译链接时自动计算的。通常是用来存放可执行代码(二进制指令)和只读常量,代码段输入静态内存分配


常量字符串不可修改

char* A="abcd"//报错
A[2]='x';

"abcd"是一个字符串常量,存储在常量区,常量区存储的东西是不能够被修改的
在存储器的栈区产生一个指针变量A指向常量区的字符串"abcd",所以后面不能通过指针来修改该字符串
为避免使用错误 一般用const修饰指向字符串常量的指针const char* A="abcd";


char* A[]="abcd"
A[2]='x';

在存储器的栈区创建一个数组A,并为数组分配内存,在内存中存放字符串"abcd"的副本,这时"abcd"的副本是存放在栈区,而不是常量区,所以,可以对其进行修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值