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

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

开发者学堂课程【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

相关文章
|
存储 C语言
指针和动态内存分配
指针和动态内存分配
|
10月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
341 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
10月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
332 3
|
11月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
951 13
|
11月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
342 11
|
11月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
11月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
11月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
206 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
105 0
深入理解java对象的内存布局