指针及其内存布局|学习笔记

简介: 快速学习指针及其内存布局。

开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:指针及其内存布局】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9536


指针及其内存布局

 

内容介绍:

一、基本介绍

二、案例演示

 

一、基本介绍

(1)基本数据类型,变量存的就是值,也叫值类型

2)获取变量的地址,用&,如:var num int ,获取 num 的地址&num

新建文件夹 pointerdemo,在该文件夹下新建一个文件 main.go

package main

import (

"fmt"

)

//演示 golang 中指针类型

func main() {

//基本数据类型在内存的布局

var i int = 10

// i 的地址是什么,

fmt.Println("i的地址=",&i)

//即可输出变量 i 的地址

}

输出结果:

i的地址=0xc04204e080

示意图(基本数据类型在内存的布局):

image.png

变量 i 代表一个值,而这个值又储存在内存空间 a 内,这一内存空间有其特定的地址0xc04204e080,该空间的地址即i变量的地址,就像一个人住了一个房间,而这个房间会对应一个门牌号,则门牌号对应的地址即这个人的地址。

(3)指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值

举例说明指针的内存布局:

如:var ptr *int = &num(因为*的存在,表示ptr是指针名称,它指向int,若没有*,ptr则是一个整数)

package main

import (

"fmt"

)

//演示 golang 中指针类型

func main() {

var i int = 10

var ptr *int = &i

//var ptr *int = &i的含义:

①ptr 是一个指针变量

②ptr 的类型*int,即指针 ptr 指向 int

③ptr 本身的值是&i

fmt.Println("i的地址=",&i)

fmt.Printf("ptr=%v\n", ptr)

fmt.Printf("ptr的地址=%v", &ptr)

}

输出结果:

i 的地址=0xc04204e080

ptr= 0xc04204e080

ptr 的地址= 0xc04206c020

ptr 指针内存分布示意图:

image.png

指针变量 ptr 会指向一个内存空间 b,该内存空间有其特定地址0xc04206c020,即ptr本身的地址,而内存空间 b 内储存的地址0xc04204e080真正指向内存空间 a。

(4)获取指针类型所指向的值,

使用:*,如var *ptr int,使用*ptr 获取 ptr 指向的值

package main

import (

"fmt"

)

//演示 golang 中指针类型

func main() {

var i int = 10

var ptr *int = &i

fmt.Println("i的地址=",&i)

fmt.Printf("ptr=%v\n", ptr)

fmt.Printf("ptr指向的值=%v", *ptr)

}

输出结果:

i 的地址=0xc04204e080

ptr= 0xc04204e080

ptr 的地址= 0xc04206c020

ptr 指向的值=10

*ptr提示计算机先取出该指针的值/地址,再用*取出该指针指向的值

 

二、案例演示

画出代码对应的指针布局示意图(自己练习)

①var num int = 1

指针内存布局示意图:

image.png

②var i = 999

var ptr *int = &i  

指针内存布局示意图:

image.png

相关文章
|
7天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
51 12
|
3月前
|
存储 C语言
指针和动态内存分配
指针和动态内存分配
94 0
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
57 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
28 0
深入理解java对象的内存布局
|
3月前
|
存储 算法 Oracle
不好意思!耽误你的十分钟,JVM内存布局还给你
先赞后看,南哥助你Java进阶一大半在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。Java生态发展被打开了新的大门,Java 7的G1垃圾回收器、Java 8的Lambda表达式和流API…大家好,我是南哥。一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。
不好意思!耽误你的十分钟,JVM内存布局还给你
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 安全 Go
Go 中的指针:了解内存引用
Go 中的指针:了解内存引用
|
3月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
2月前
crash —— 获取物理内存布局信息
crash —— 获取物理内存布局信息
|
3月前
|
存储 编译器 C++
Method&ConstMethod的内存布局
综上所述,常规方法和常量方法在对象的内存布局中并不直接占据空间;它们作为代码的一部分存储在程序的代码段中。对于虚方法(包括常量虚方法),它们通过VTable在对象中有表示,但即便在这种情况下,方法代码本身也不在对象的内存布局中。理解这些概念有助于深入理解面向对象编程,提高编程效率和代码的可理解性。
37 3