指针变量的内存分解
关于指针, 大一时学C++的时候感觉悟懂了, 之后到现在已经 7 年没有碰指针了, 现在学go的时候又发现之前学的好像不太正确, 甚至都忘光了, 现在重新整理下
基础知识
& 作为取址符, 在变量前面作用是获取变量的内存地址.
* 可以作为取值符 和指针声明符
-
* 定义变量的时候和类型一起用是作为指针声明符的 , * 表示变量是一个指针变量
// 声明一个指针, 紧贴在变量前面
int *ptr1;
// 声明一个指针, 紧贴在类型后面
int* ptr2
在 C++ 种以下两种方式都是正确的, 但是相对于第一种, 第二种方式在视觉上强化了 ptr 的数据类型不是 int,而是 int 指针, 同时防止和取值符 * 混淆
-
C++ 中声明指针并赋值 int a = 5;
// 声明一个指针, 紧贴在变量前面
int *ptr1 = &a;
// 声明一个指针, 紧贴在类型后面
int* ptr2 = &a
-
go 中指针的定义
var ptr *int
-
go 中声明指针并赋值
int a = 5
var ptr1 *int = &a
ptr2 := &a
-
* (作为取值符 ) * 和已经定义好并赋值 的指针变量一起使用是作为取值符 的 当指针变量声明并赋值后, 此时指针变量所在的内存地址存储的值是另外一个内存地址,
指针内存分解(go语言)
-
变量定义和初始化 var a int = 4
var b int = 9
如上图定义了一个整型变量, 计算机为变量分配了一个地址 0x100 来对应变量a , 并将此段地址赋值为4.
常量和变量: 当定义一个变量或常量时, 计算机会在内存中我们开辟一段空间.
a 和 0x001 的关系: 0x001 是一个内存地址, 是给电脑识别的, a是一个变量是给人识别的, a对应的内存地址就是0x001 , 可以将 a 视为 0x001 的一个代号.
-
指针定义和初始化 var p *int = &a
定一个指针变量, 获取a的内存地址, 并将内存地址赋给指针变量p
&a 是取址符, 就是说获取 a 所在的地址, 就是 0x100 , 而0x100 是个地址, 这是一个特殊的值, 他需要被一个可以接收地址的变量引用, 而这个引用成为指针变量 .
* 在此时是一个指针声明符
-
在第二步的基础上执行: *p = b var a int = 4
var b int = 9
var p *int = &a
*p = b
* 在此是取值符, p 指向的是 a的内存地址, 在这里, *p = b 相当于 a = b
-
在第二步的基础上执行: p = &b var a int = 4
var b int = 9
var p *int = &a
p = &b
&b 表示取变量b的地址, 在此b指向的是 0x104 , 因此 p = &b 在此相当于 0x104 这个地址赋给 指针变量 p
|