const static 指针引用等笔记

本文探讨了C++中const和static的关键概念,包括常量定义的两种方式(宏定义和const变量),常量指针与指针常量的区别,以及static在局部变量、全局变量和函数中的应用,重点讲解了它们在内存管理和生命周期管理上的特点。
摘要由CSDN通过智能技术生成

const

C++定义常量两种方式

1.define 宏常量: #define 常量名 常量值

通常在文件上方定义,表示一个常量

2.const修饰的变量 const 数据类型 常量名 = 常量值

通常在变量定义前加关键字const,修饰该变量为常量,不可修改

const修饰指针

1.const修饰指针–常量指针
2.const修饰常量–指针常量
3.const即修饰指针又修饰常量

int a = 10;
int b = 1;

//常量指针,指针指向地址里存放的内容不可以修改,但指针指向的地址可以修改
const int * p1=&a;

*值得注意的是常量指针还有一种写法:int const p1和上述写法等价

//指针常量,指针指向的地址不可以修改,但地址中存放的内容可以修改
int *const p2 = &b;

//既修饰指针又修饰常量,两者都不可以修改
const int * const p3 = &a;

记忆方法:谁在前面就强调谁不可改变,比如指针常量,指针在前面那就指针在前面地址不能变即指向不能变。常量指针,常量在前面,那就量不能变,即指向的内容不能变

static

函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。

静态数据的存储

全局(静态)存储区:分为 DATA 段和 BSS 段。DATA 段(全局初始化区)存放初始化的全局变量和静态变量;BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BSS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

在 C++ 中 static 的内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
在 C/C++ 中static的作用
(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
(4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。

引用

引用的本质实际上是一个指针常量,它的指向不可以改变,但是它指向地址内存放的值是可以改变的。这也解释为什么引用在初始化后就不可以改变了。(再改变相当于改变了指向)

引用int &ref,内部会转换为int * const ref;是一个指针常量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值