[GO]变量内存和变量地址

package main

import "fmt"

func main()  {
    var a int = 10
    //每个变量都有两层含义,变量的内存和变量的地址
    fmt.Printf("a = %d\n", a) //变量的内存 10
    fmt.Printf("a = %v\n", &a) //变量的地址 0xc042060080

    //保存某个变量的地址,需要指针类型, *int保存int的地址, **int保存*int的地址
    //声明(定义),定义只是特殊的声明
    //定义一个变量p,类型为*int
    var p *int
    p = &a
    fmt.Printf("p = %v, &a = %v\n", p, &a)
    *p = 666 //*p操作的不是p的内存,是p指向的内存(其实就是a)
    fmt.Printf("*p = %v, a = %v\n", *p, a)
}

执行结果为

GOROOT=C:\Go #gosetup
GOPATH=E:\go\develop #gosetup
C:\Go\bin\go.exe build -i -o C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe E:/awesomeProject01/指针的基本操作.go #gosetup
"C:\Program Files\JetBrains\GoLand 2018.1.5\bin\runnerw.exe" C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe #gosetup
a = 10
a = 0xc042060080
p = 0xc042060080, &a = 0xc042060080
*p = 666, a = 666

注意,永远不要操作没有合法指向的内存,比如:

package main

import "fmt"

func main()  {
    var p *int
    p = nil
    fmt.Printf("p = %v\n", p)

    *p = 666 //这个就是错误的,因为它没有正确的指向内存地址
    fmt.Printf("*p = %v\n", *p)
}

执行结果

GOROOT=C:\Go #gosetup
GOPATH=E:\go\develop #gosetup
C:\Go\bin\go.exe build -i -o C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe E:/awesomeProject01/不要操作没有合法指向的内存.go #gosetup
"C:\Program Files\JetBrains\GoLand 2018.1.5\bin\runnerw.exe" C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe #gosetup
p = <nil>
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x0 pc=0x48ce1c]

goroutine 1 [running]:
main.main()
    E:/awesomeProject01/不要操作没有合法指向的内存.go:10 +0x7c

正确的写法应该是这样的

var a int
p = &a
*p = 666
fmt.Printf("*p = %v\n", *p)

执行结果

p = <nil>
*p = 666

原文地址:https://www.cnblogs.com/baylorqu/p/9534548.html

时间: 2024-08-12 23:12:29

[GO]变量内存和变量地址的相关文章

C语言结构体变量内存分配与地址对齐

地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下规则: 原则1:数据成员对齐规则:结构的数据成员,第一个数据成员放在偏移量(offset)为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 原则2:收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大

C++变量内存分配及类型修饰符

前言 了解C++程序内存分配,有助于深刻理解变量的初始化值以及其生存周期.另外,变量类型修饰符也会影响到变量的初始化值及其生存周期.掌握了不同类型变量的初始化值及其生存周期,能够让我们设计程序时定义变量时更准确. 内存分配 1.     C++程序的内存布局 现代电脑都是遵循冯诺依曼体系结构,所以C++程序的内存布局也是遵循该体系的.主要包括5个部分,即代码段.数据段.BSS段.堆和栈.. 1.     代码段 代码段(code segment/text segment),通常是指用来存放程序执

js 作用域链&amp;内存回收&amp;变量&amp;闭包

闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变量,则

python变量内存浅析

1. Python变量 如果把单一值变量称为一维变量,把可以扩展元素的变量称为多维变量,则python的变量可以划分如下: 变量维度 Python变量 说明 一维 数字 int(有符号整型) 数字类型可以做转换 long(长整型[也可以代表八进制和十六进制]) float(浮点型) complex(复数) 字符串 字符串有丰富的运算符和内嵌函数: 有格式化输出: 二维 列表 除了元祖外,列表和字典可以灵活的扩展元素 元组 字典 2. Python变量的赋值处理 这里主要分析情况为,将原始变量赋值

案例描述:不同类型变量顺序保存时,变量强制转换对变量内存的影响。

大家都知道c语言变量的存储是从小到大增加. address c :FF39 address n :FF3A 并没有改变c和n的地址. address c :FF39 address n :FF3A 但是c的值被改变了, c的值变成了-127. 上述实验表明了变量的强制转换并不会对变量的存放地址产生影响,只会对变量的值产生影响.案例描述:不同类型变量顺序保存时,变量强制转换对变量内存的影响.

黑马程序员——C语言变量内存分析与scanf函数

Java培训.Android培训.iOS培训..Net培训.期待与您交流! 1.变量的内存分析 1)变量以字节为单位,每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间就相当于是每个字节,地址就是房号,根据房号可以找到房间(根据地址也可以找到内存中的字节).相邻房间的房号是连续的,相邻字节的地址也是连续的.计算机中通常以十六进制表示地址.变量所占用字节数跟类型有关,也跟编译器环境有关 2)内存由大到小寻址,优先分配内存地址较大的字节

变量名和变量地址

变量名和变量地址 研一时,很偶然的翻开谭浩强老先生的<C程序设计>(是师姐的书,俺的老早就卖了,估计当时觉得这本书写得不够好),很偶然的看到关于变量名的一段话:"变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址.在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据." 当时很震惊上课的时候居然没有发现这句蛮有深意的话语,可是研一的时候还是没有完全明白,只是知道有这么几个东西:变量名.内存地址.变量值.后来看到指

static修饰的静态变量与实例变量的区别,及其在初始化和内存中的运行机制详解

1. 静态变量的定义 静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量. 说明:静态变量(用static修饰),它所被分配的空间是一直伴随程序运行的,空间将会保持到程序的结束关闭,才会被释放. 2.用static修饰的静态变量与普通变量的区别 假若在定义一个类的过程中,定义了一个static修饰的变量,那么这个类在被加载的同时,被static修饰的变量就存在于内存当中了,这样一来就独立于该类的所有对象,

C和C++ 变量内存

当我们在C或C++ 代码中定义了一个 int /long 类型的变量时,计算机会在内存中分配一段连续的内存来保存变量的值.(int 占用的内存大小和编译器位数有关,16位占用2个字节,32位占用4个字节, long 在32位编译器占用4个字节,64位编译器占用8个字节). #include <stdio.h> int main() { int i = 1; int j = -2; long l = 3, m = 4; printf("Hello world sizeof(i)=%d,