指针变量的内存分解
关于指针, 大一时学C++的时候感觉悟懂了, 之后到现在已经 7 年没有碰指针了, 现在学go的时候又发现之前学的好像不太正确, 甚至都忘光了, 现在重新整理下
基础知识
&
作为取址符, 在变量前面作用是获取变量的内存地址.
*
可以作为取值符
和指针声明符
-
*
定义变量的时候和类型一起用是作为指针声明符的
,*
表示变量是一个指针变量C++
中指针的定义
// 声明一个指针, 紧贴在变量前面 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 // 方式1 var ptr1 *int = &a // 方式2 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