slice切片扩容之后,还是指向原来的底层数组吗?

寅恪光潜
深度学习领域优质创作者
博客专家认证
2022-11-16 12:37:22
加精

我们看下slice的结构体:

type slice struct {
    array unsafe.Pointer // 指向底层数组
    len int // 长度,必选
    cap int // 容量,可选
}

第一个成员变量指向的是底层数组,还有长度和容量的成员变量,可以扩容。
我们做切片操作,这个在容量范围内都是指向同一个底层数组:

package main

import "fmt"

func main() {
	s1 := []int{1, 2, 3}
	s2 := s1[0:]

	for i, v := range s2 {
		s2[i] = v * 2
	}

	fmt.Printf("%p,%p", s1, s2)
	fmt.Printf("%v,%v", s1, s2)
}
//0xc000012150,0xc000012150[2 4 6],[2 4 6]

内存地址一样,修改s2也修改了s1,然后我们进行扩容操作,看下会不会指向同一底层数组?

package main

import "fmt"

func main() {
	s1 := []int{1, 2, 3}
	s2 := s1[0:]

	for i, v := range s2 {
		s2[i] = v * 2
	}

	fmt.Printf("%p,%p", s1, s2)
	fmt.Printf("%v,%v\n", s1, s2)
	//扩容操作
	s2 = append(s2, 11)
	for i, v := range s2 {
		s2[i] = v * 2
	}
	fmt.Printf("%p,%p", s1, s2)
	fmt.Printf("%v,%v", s1, s2)
}
/*
0xc000012150,0xc000012150[2 4 6],[2 4 6]
0xc000012150,0xc00000e3f0[2 4 6],[4 8 12 22]
*/

我们可以看出在扩容之后,s2的修改,s1没有跟着变化了,说明扩容之后没有指向同一个底层数组而是新开了一个。

...全文
73 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问

197

社区成员

发帖
与我相关
我的任务
社区描述
从零开始的小白到进阶成技术达人。 一起学习,一起进步。
golanggo1.19 个人社区 贵州省·贵阳市
社区管理员
  • 寅恪光潜
  • 网络豆
  • Somnus_小凯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Go语言集各语言优势之大成,从基础到进阶

一起学习,一起进步,成为技术达人!

试试用AI创作助手写篇文章吧