常量能获取地址吗?

我们先来看一段代码:

const cl = 100

var bl = 123

func check_const() {
	fmt.Println(&bl, bl)
	fmt.Println(&cl, cl) 
}

我们试图去编译这段代码,编译期会报如下错误:

Cannot take the address of 'cl'

这说明我们无法获取到 cl 的地址。

为什么我们不能获取到 cl 的地址呢?

常量不同于变量的在运行期分配内存,常量通常会被编译器在预处理阶段直接展开,作为指令数据使用内存四区概念:

数据类型本质:

固定内存大小的别名

数据类型的作用:

编译器预算对象(变量)分配的内存空间大小。

内存四区

在这里插入图片描述
流程说明

  1. 操作系统把物理硬盘代码load到内存

  2. 操作系统把c代码分成四个区

  3. 操作系统找到main函数入口执行

栈区(Stack):

空间较小,要求数据读写性能高,数据存放时间较短暂。由编译器自动分配和释放,存放函数的参数值、函数的调用流程方法地址、局部变量等(局部变量如果产生逃逸现象,可能会挂在在堆区)

堆区(heap):

空间充裕,数据存放时间较久。一般由开发者分配及释放(但是 Go 中会根据变量的逃逸现象来选择是否分配到栈上或堆上),启动 Go 的 GC 由 GC清除机制 自动回收。

全局区-静态全局变量区:

全局变量的开辟是在程序在 main 之前就已经放在内存中。而且对外完全可见。即作用域在全部代码中,任何同包代码均可随时使用,在变量会搞混淆,而且在局部函数中如果同名称变量使用 := 赋值会出现编译错误。
全局变量最终在进程退出时,由操作系统回收。

我们在开发的时候,尽量减少使用全局变量的设计

全局区-常量区:

常量区也归属于全局区,常量为存放数值字面值单位,即不可修改。或者说的有的常量是直接挂钩字面值的。

比如:

const cl = 10

cl 是字面量 10 的对等符号。

所以在 Go 中,常量是无法取出地址的,因为字面量符号并没有地址而言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值