golang 用range 创建指针数组
一下内容摘自:https://www.runoob.com/go/go-array-of-pointers.html
创建指针数组的时候,不适合用 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)} }
输出结果为:
指针数组:索引: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
从结果中可以看出内存地址都不一样。
关于楼上的创建指针数组的时候,说的不适合用 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 number,ptrs[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月 January 2月 February 3月 Ma ...
- Golang——指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针
指针: 指针是一个特殊的变量,因为存储的数据不仅仅是一个普通的数据,而是一个变量的内存地址,指针本身也是有内存地址的 指针的数据类型有int.float.bool.string.数组.结构体 指针的作 ...
- golang 数组、指针数组、数组指针使用总结
package mainimport ("fmt")func main() {//创建at:=[6]int{}//下标赋值ap:=[5]int{3:2}//下标3的值赋值为2fmt ...
- Golang学习——数组指针和指针数组的区别
Golang中数组指针和指针数组区别 一.数组指针 1.语法 2.实例 3.通过指针访问数组 二.指针数组 1.语法 2.实例 区别二者,字面上只看 后两个字即可: 数组指针 :它是一个指针,但是数据 ...
- 【C语言】指针进阶实践(指针数组和创建单链表)
目录 1.指针数组 2.单链表创建 1.指针数组 编写程序,输入n(n<10)个字符,输出其中最长字符串的有效长度.要求自定义函数int max_len(char *s[] , int n),用 ...
- golang 数据一 (字符串、数组和数组指针)
从如下几个方面介绍GO语言的数据 1. 字符串 2. 数组 3. 切片 4. 字典 5. 结构 字符串 Go语言中的字符串是由一组不可变的字节(byte)序列组成从源码文件中看出其本身是一个复合结构 ...
- golang数据结构与算法——稀疏数组、队列和链表
文章目录 一 稀疏数组 1.1 先看一个实际的需求 1.2 稀疏数组基本介绍 1.3 稀疏数组举例说明 1.4 把数组转换为稀疏数组实现 1.5 把稀疏数组还原为原数组 二 队列 2.1 队列的介绍 ...
- C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)
1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...
- 手写堆模板(指针数组)
文章目录 使用说明 1.插入式建堆 2.直接在数组基础上调整排序建堆 使用说明 本文的堆以小根堆为例,给出模板 使用时将ElementType 修改为对应的数据类型就好 1.插入式建堆 建一个空堆,将 ...
最新文章
- json对象(json-lib)转换成list-map集合
- 虚拟服务器目录,服务器虚拟主机目录
- Java书籍Top 10
- sniffer 和 debug flow
- 链内容百度新算法怎样判断高质量外链和原创内容
- ACM_逆序数(归并排序)
- Struts2+Spring+Hibernate环境搭建
- IntelliJ IDEA for Mac的快速切换当前主题方案(Quick switch current scheme)
- Spring Security 示例UserDetailsS​​ervice
- JDBC连接数据库:单线程、多线程、批处理插入数据的对比
- java删除cookie_JAVAWEB使用保存cookie、删除cookie、获取cookie工具类
- C/C++网络编程详解(Windows版)
- Mac之系统中各个文件夹详细介绍
- 知乎上100条简短深刻的回答
- 你好2010,再见2009
- 《陰陽師·付喪神卷·瓜仙人》原作:梦枕貘
- anki卡片浏览器_Anki Guide by Corkine
- 大学物理复习-静电场
- On children
- python简易英文字典_Python爬虫:自制简易词典
热门文章
- 事件循环机制 + ES7:Async/Await(基于generator原理实现)附详细示例分析
- ES6——let、参数增强、箭头函数、模板字符串、for of和解构
- 超详细:Springboot连接centos7下redis6的必要配置和失败分析
- 伪数组转化真数组_ES6 数组方法
- window.btoa()方法;使字符编码成base64的形式
- cocos2d-x JS 重力感应监听事件
- java中length,length(),size()区别
- E-MapReduce解决hive comment中文乱码问题
- Spring 2.5新特性及架构图
- ASP.NET AJAX入门系列