一下内容摘自:https://www.runoob.com/go/go-array-of-pointers.html

  1. 创建指针数组的时候,不适合用 range 循环。

  2. 错误代码:

    const max = 3func main() {number := [max]int{5, 6, 7}var ptrs [max]*int //指针数组//将number数组的值的地址赋给ptrsfor i, x := range &number {ptrs[i] = &x}for i, x := range ptrs {fmt.Printf("指针数组:索引:%d 值:%d 值的内存地址:%d\n", i, *x, x)}
    }

    输出结果为:

    指针数组:索引:0 值:7 值的内存地址:824634204304
    指针数组:索引:1 值:7 值的内存地址:824634204304
    指针数组:索引:2 值:7 值的内存地址:824634204304

    从结果中我们发现内存地址都一样,而且值也一样。怎么回事?

    这个问题是range循环的实现逻辑引起的。跟for循环不一样的地方在于range循环中的x变量是临时变量。range循环只是将值拷贝到x变量中。因此内存地址都是一样的。

    正确代码如下:

    const max = 3func main() {number := [max]int{5, 6, 7}var ptrs [max]*int //指针数组//将number数组的值的地址赋给ptrsfor i := 0; i < max; i++ {ptrs[i] = &number[i]}for i, x := range ptrs {fmt.Printf("指针数组:索引:%d 值:%d 值的内存地址:%d\n", i,*x, x)}
    }

    输出结果为:

    指针数组:索引:0 值:5 值的内存地址:824634212672
    指针数组:索引:1 值:6 值的内存地址:824634212680
    指针数组:索引:2 值:7 值的内存地址:824634212688

    从结果中可以看出内存地址都不一样。

  3. 关于楼上的创建指针数组的时候,说的不适合用 range 循环。

    其实不是不能用 range 循环,只是楼主不会用而已。

    这是楼主的原始代码:

    const max = 3func main() {number := [max]int{5, 6, 7}var ptrs [max]*int //指针数组//将number数组的值的地址赋给ptrsfor i, x := range &number {ptrs[i] = &x}for i, x := range ptrs {fmt.Printf("指针数组:索引:%d 值:%d 值的内存地址:%d\n", i, *x, x)}
    }

    这样是使用 range 的正确用法,两个地方改动:range &number 改成 range numberptrs[i] = &x 改成 ptrs[i]=&number[i]

    const max = 3func main() {number := [max]int{5, 6, 7}var ptrs [max]*int //指针数组//将number数组的值的地址赋给ptrsfor i, x := range number {ptrs[i] = &number[i]}for i, x := range ptrs {fmt.Printf("指针数组:索引:%d 值:%d 值的内存地址:%d\n", i, *x, x)}
    }

golang 用range 创建指针数组相关推荐

  1. 月份查询(指针数组)

    题目描述 已知每个月份的英文单词如下,要求创建一个指针数组,数组中的每个指针指向一个月份的英文字符串,要求根据输入的月份数字输出相应的英文单词 1月 January 2月 February 3月 Ma ...

  2. Golang——指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

    指针: 指针是一个特殊的变量,因为存储的数据不仅仅是一个普通的数据,而是一个变量的内存地址,指针本身也是有内存地址的 指针的数据类型有int.float.bool.string.数组.结构体 指针的作 ...

  3. golang 数组、指针数组、数组指针使用总结

    package mainimport ("fmt")func main() {//创建at:=[6]int{}//下标赋值ap:=[5]int{3:2}//下标3的值赋值为2fmt ...

  4. Golang学习——数组指针和指针数组的区别

    Golang中数组指针和指针数组区别 一.数组指针 1.语法 2.实例 3.通过指针访问数组 二.指针数组 1.语法 2.实例 区别二者,字面上只看 后两个字即可: 数组指针 :它是一个指针,但是数据 ...

  5. 【C语言】指针进阶实践(指针数组和创建单链表)

    目录 1.指针数组 2.单链表创建 1.指针数组 编写程序,输入n(n<10)个字符,输出其中最长字符串的有效长度.要求自定义函数int max_len(char *s[] , int n),用 ...

  6. golang 数据一   (字符串、数组和数组指针)

    从如下几个方面介绍GO语言的数据 1. 字符串 2. 数组 3. 切片 4. 字典 5. 结构 字符串 Go语言中的字符串是由一组不可变的字节(byte)序列组成从源码文件中看出其本身是一个复合结构 ...

  7. golang数据结构与算法——稀疏数组、队列和链表

    文章目录 一 稀疏数组 1.1 先看一个实际的需求 1.2 稀疏数组基本介绍 1.3 稀疏数组举例说明 1.4 把数组转换为稀疏数组实现 1.5 把稀疏数组还原为原数组 二 队列 2.1 队列的介绍 ...

  8. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  9. 手写堆模板(指针数组)

    文章目录 使用说明 1.插入式建堆 2.直接在数组基础上调整排序建堆 使用说明 本文的堆以小根堆为例,给出模板 使用时将ElementType 修改为对应的数据类型就好 1.插入式建堆 建一个空堆,将 ...

最新文章

  1. json对象(json-lib)转换成list-map集合
  2. 虚拟服务器目录,服务器虚拟主机目录
  3. Java书籍Top 10
  4. sniffer 和 debug flow
  5. 链内容百度新算法怎样判断高质量外链和原创内容
  6. ACM_逆序数(归并排序)
  7. Struts2+Spring+Hibernate环境搭建
  8. IntelliJ IDEA for Mac的快速切换当前主题方案(Quick switch current scheme)
  9. Spring Security 示例UserDetailsS​​ervice
  10. JDBC连接数据库:单线程、多线程、批处理插入数据的对比
  11. java删除cookie_JAVAWEB使用保存cookie、删除cookie、获取cookie工具类
  12. C/C++网络编程详解(Windows版)
  13. Mac之系统中各个文件夹详细介绍
  14. 知乎上100条简短深刻的回答
  15. 你好2010,再见2009
  16. 《陰陽師·付喪神卷·瓜仙人》原作:梦枕貘
  17. anki卡片浏览器_Anki Guide by Corkine
  18. 大学物理复习-静电场
  19. On children
  20. python简易英文字典_Python爬虫:自制简易词典

热门文章

  1. 事件循环机制 + ES7:Async/Await(基于generator原理实现)附详细示例分析
  2. ES6——let、参数增强、箭头函数、模板字符串、for of和解构
  3. 超详细:Springboot连接centos7下redis6的必要配置和失败分析
  4. 伪数组转化真数组_ES6 数组方法
  5. window.btoa()方法;使字符编码成base64的形式
  6. cocos2d-x JS 重力感应监听事件
  7. java中length,length(),size()区别
  8. E-MapReduce解决hive comment中文乱码问题
  9. Spring 2.5新特性及架构图
  10. ASP.NET AJAX入门系列