常量能获取地址吗?

简介: 常量能获取地址吗?

我们先来看一段代码:

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 中会根据变量的逃逸现象来选择是否分配到栈上或堆上),启动 GoGCGC清除机制 自动回收。

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

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


全局变量最终在进程退出时,由操作系统回收。


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

全局区-常量区:

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

比如:

const cl = 10


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


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

相关文章
|
2月前
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
|
6月前
|
编译器 C++
【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 )
本文探讨了C++中类的成员函数,特别是取地址及const取地址操作符重载,通常无需重载,但展示了如何自定义以适应特定需求。接着讨论了构造函数的重要性,尤其是使用初始化列表来高效地初始化类的成员,包括对象成员、引用和const成员。初始化列表确保在对象创建时正确赋值,并遵循特定的执行顺序。
|
6月前
|
编译器 C++
【C++】:const成员,取地址及const取地址操作符重载
【C++】:const成员,取地址及const取地址操作符重载
50 0
|
7月前
|
编译器 C++
【C++】类与对象(运算符重载、const成员、取地址重载)
【C++】类与对象(运算符重载、const成员、取地址重载)
53 2
【C++】类与对象(三) 运算符重载 赋值重载 取地址及const取地址操作符重载(1)
【C++】类与对象(三) 运算符重载 赋值重载 取地址及const取地址操作符重载
|
7月前
|
存储 前端开发 程序员
一级指针和二级指针,取地址和不取地址调用函数区别及其应用
一级指针和二级指针,取地址和不取地址调用函数区别及其应用
|
7月前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
7月前
|
编译器 C++
【c++】取地址及const取地址操作符重载
【c++】取地址及const取地址操作符重载
【c++】取地址及const取地址操作符重载
|
7月前
|
存储 C语言
【C语言】深入理解取地址符&:与内存地址的联系
【C语言】深入理解取地址符&:与内存地址的联系
526 0
|
7月前
|
编译器
lesson2(补充)取地址及const取地址操作符重载
lesson2(补充)取地址及const取地址操作符重载
42 0