定义一些变量,并输出其地址

一、一般变量

var a, b int32
var c, d int64

输出其地址

结果:

a 0xc082006310
b 0xc082006320
c 0xc082006330
d 0xc082006340

结论:

  它们的地址间隔均为16字节,其它空余的地址浪费了?

二、数组切片

e := make([]byte, 40)
f := make([]byte, 40)
g := make([]byte, 40)
f = []byte("12345678901234567890") //字符串长度为20字节
g = []byte("1234567890123456789012345678901234567890") //字符串长度为40字节

  

1.输出各自len()与cap()

结果:

e:  40  40

f:  20  40

g:  40  40

结论:

  a.切片的实际长度len()与其数据的长度相关,f[30]是不可访问的;

  b.make([]byte,40)只保证其最大容量为40,即cap()=40。

2.输出首地址及其首个元素地址:

fmt.Printf("&e:%p &e[0]:%p ", &e, &e[0])
fmt.Printf("&f:%p &f[0]:%p ", &f, &f[0])
fmt.Printf("&g:%p &g[0]:%p ", &g, &g[0])

  

结果:

&e:0xc082008660   &e[0]:0xc08204c060  
&f:0xc082008680   &f[0]:0xc0820086c0   
&g:0xc0820086a0   &g[0]:0xc08204c0f0

结论:

  a.顺序声明切片变量时,它们的地址是"连续"的,分别间隔32字节;

  b.切片的数据地址与切片本身的地址无关 

3.对于以下代码:

type test struct {
data []byte
}
func (t *test) set(buf []byte) {
t.data = buf
return
}

  

t.data=buf 意味着什么?

1)输出a和b的某些地址:

a := []byte("1234567890")
b := new(test)
b.set(a)

结果:

&a:     0xc082002660
       &a[0]:     0xc082004310
           &b:     0xc082028020
    &b.data:      0xc082002680
&b.data[0]:    0xc082004310

2)输出a和b.data的len()和cap()

结果:

a:    10  16

b.data:  10  16

结论:

   &a[0]==&b.data[0],且两者的数据和容量均相同,所以推测t.data=buf 意味着t.data和buf指向同一段数据 

  

  

  

  

  

  

go:关于变量地址的疑惑的更多相关文章

  1. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

  2. java中打印变量地址

    在java中打印变量的地址 这个代码是在startoverflow上看到的,跟大家分享一下. import sun.misc.Unsafe; import java.lang.reflect.Fiel ...

  3. 驱动中获取PsActiveProcessHead变量地址的五种方法也可以获取KdpDebuggerDataListHead

    PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其Act ...

  4. list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址

    #define list_entry(ptr, type, member) \ ((type *)(() -> member))) 解释: 1 在0这个地址看做有一个虚拟的type类型的变量,那 ...

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

    package main import "fmt" func main() { //每个变量都有两层含义,变量的内存和变量的地址 fmt.Printf("a = %d\n ...

  6. C++打印变量地址

    %p专门用来打印变量的以十六进制表示的地址: #include<iostream> using namespace std; int main() { ; printf("a的地 ...

  7. 打印变量地址-0x%08x

    地址是8个16进制数. 1.8个16进制数:相当于32个二进制数.4G内存刚好可以用32位的二进制表示出来.2.因为变量或函数等等在运行时都是存储在内存中的,所以你用取地址符当然是取出计算机内存中的地 ...

  8. c++中变量、变量名、变量地址、指针、引用等含义

    首先了解内存,内存就是一排房间,编号从0开始,0,1,2,3,4,5...... 房间里面一定要住人,新人住进去了,原来的人就走了:不管你住不住,里面都有人. 编号就是地址.里面的人就是内容,为了我们 ...

  9. Davinci-DM6467板子-外围器件的I2C地址的疑惑解答

    这篇文即调试标清视频或者说调试TVP5147和ADV7343所使用的程序名称为video_sd_playback_480i_composite 我们用的是合众达公司(SEED)的SEED-DVSD64 ...

随机推荐

  1. NBUT 1457 莫队算法 离散化

    Sona Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format: Submit Status Practice NBUT 145 ...

  2. 敏捷组织中PMO应遵循的准则

    敏捷改变了人们的工作方式,不仅仅是开发部门,而且还包括其它的部门,例如HR.财务以及PMO等.在大多数组织中,PMO是一个控制体.它指导项目团队的规范.模板以及流程.目前,大多数的IT组织都敏捷化了. ...

  3. cocos2d-x 帧动画

    ani = cc.Animation:create(); ...... local animate = cc.Animate:create(ani); s:runAction(animate); 发现 ...

  4. 生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)

    一.在 .NET 中生成1.直接用.NET Framework 提供的 Guid() 函数,此种方法使用非常广泛.GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的任何两台计 ...

  5. Asp.net MVC的ViewData与ViewBag以及TemplateData的使用与区别

    ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才有 基于Asp.net 3.5 fram ...

  6. JS 循环给li绑定参数不同的点击事

    以下内容纯属个人理解,不正确的地方还请大神留言,不胜感激! 源代码:(按个人方式选用一种即可) <ul> <li>1</li> <li>2</li ...

  7. js学习篇--数组按升序降序排列

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 如何解决inline和linline-block在浏览器中的间距问题

    写页面时,如果想要元素从左到右排列,但又不想使用浮动,那么很多人都会用到display:inline或者display:inline-block. 但是每次一用到这个两个属性,浏览器中浏览的时候就会有 ...

  9. ThinkPHP的URL访问

    url访问 http://www.kancloud.cn/manual/thinkphp5/118012 ThinkPHP5.0在没有启用路由的情况下典型的URL访问规则是: http://serve ...

  10. Yii2 高级模板添加更多Application

    单独的前端和后端有时是不够的. 如果需要额外的应用程序,例如博客blog: 1.将frontend复制到blog,环境/ dev / frontend到environments / dev / blo ...