Go语言基础第07天(指针提高)

本文详细探讨了Go语言中数组指针、切片指针、结构体指针、多级指针的用法,包括指针作为函数参数、切片动态扩容、以及它们在数据结构和函数调用中的作用。通过实例展示了如何间接操作数组元素、切片操作和结构体成员的修改。
摘要由CSDN通过智能技术生成

1.数组指针

func main0101() {

	var arr [5]int = [5]int{123, 2, 3, 4, 5}

	//fmt.Printf("%p\n",&arr)
	//fmt.Printf("%p\n",&arr[0])

	//p:=&arr
	//定义指针指向数组
	var p *[5]int
	//将指针变量和数组建立关系
	p = &arr

	//可以通过指针间接操作数组
	//*p [0] ==  arr[0]
	fmt.Println(*p)
	fmt.Println(arr)
	fmt.Println((*p)[0])
	//直接使用指针[下标]操作数组元素
	fmt.Println(p[0])
	fmt.Printf("%p\n", p)
	fmt.Printf("%T\n", p)

}
func main0102() {
	var arr [5]int = [5]int{123, 2, 3, 4, 5}
	//指向数组的指针
	//p:=&arr //*[5]int
	p := &arr[0]
	fmt.Printf("%T", p)
	//len(指针变量)元素个数
	//fmt.Println(len(p))
	//for i := 0; i<len(p);i++  {
	//	fmt.Println(p[i])
	//}

	//fmt.Printf("%p\n",p)
	//fmt.Printf("%p\n",&arr) //*[5]int
	//fmt.Printf("%p\n",&arr[0]) //*int

}

2.切片指针

func main0201() {
	var slice []int = []int{1, 2, 3, 4, 5}

	//p:=&slice//*[]int

	var p *[]int //二级指针
	p = &slice

	//fmt.Printf("%T",p)

	//切片名本身就是一个地址
	//fmt.Printf("%p\n",slice)
	//fmt.Printf("%p\n",p)
	//fmt.Printf("%p\n",*p)

	//(*p)[1]=200//ok
	//p[1]=123 //err 不能通过指针访问切片中的元素
	fmt.Println(slice)
	fmt.Println(*p)

}
func main0202() {
	var slice []int = []int{1, 2, 3, 4, 5}

	fmt.Printf("%p\n", slice)

	//p:=&slice//*[]int

	var p *[]int //二级指针
	p = &slice

	*p = append(*p, 6, 7, 8, 9, 10)

	fmt.Printf("%p\n", slice)
	fmt.Println(slice)
}

3.切片指针作为函数参数

//func test(s []int) {
//	s=append(s,4,5,6)
//}

func test(s *[]int) {
	*s = append(*s, 4, 5, 6)
}

func main0301() {
	s := []int{1, 2, 3}
	fmt.Printf("%p\n", s)
	//切片指针作为函数参数是地址传递  形参可以改变实参的值
	test(&s)

	fmt.Printf("%p\n", s)
	fmt.Println(s)
}

4.new创建切片指针

func main0401() {

	var p *[]int
	fmt.Printf("%p\n", p)
	p = new([]int)
	fmt.Printf("%p\n", p)

	*p = append(*p, 1, 2, 3)
	//for i := 0; i<len(*p);i++  {
	//	fmt.Println((*p)[i])
	//}
	for i, v := range *p {
		fmt.Println(i, v)
	}
	//fmt.Println(len(*p))

}

5.指针数组

func main0501() {

	//var arr [3]int ->int
	//指针数组
	var arr [3]*int //->*int
	a := 10
	b := 20
	c := 30

	arr[0] = &a
	arr[1] = &b
	arr[2] = &c

	//fmt.Println(arr)
	//fmt.Printf("%p\n",&a)
	//fmt.Printf("%p\n",&b)
	//fmt.Printf("%p\n",&c)

	//通过指针数组改变变量的值
	//*arr[1]=2
	//
	//fmt.Println(b)

	//变量指针数组对应的内存空间的值
	for i := 0; i < len(arr); i++ {
		fmt.Println(*arr[i])
	}

}

6.指针切片

func main0601() {
	//指针切片
	var slice []*int
	a := 10
	b := 20
	c := 30
	d := 40
	slice = append(slice, &a, &b, &c)

	slice = append(slice, &d)
	fmt.Println(slice)

	for i, v := range slice {
		//fmt.Printf("%T",v)
		fmt.Println(i, v)
		fmt.Println(i, *v)
	}

}

7.结构体指针

type Student struct {
	name string
	id   int
	age  int
	sex  string
}

func main0701() {
	// 定义结构体变量
	// var 结构体名 结构体数据类型

	var stu Student = Student{id: 101, name: "多啦A梦", age: 100, sex: "男"}
	// 结构体变量.成员=值

	// 定义结构体指针指向变量的地址
	var p *Student
	//结构体指针指向结构体变量地址
	p = &stu
	p1 := &stu
	p2 := &stu.name

	fmt.Printf("%T\n", p1) //*Student
	fmt.Printf("%T\n", p2) //*int

	fmt.Printf("%T", p)
	fmt.Printf("%p\n", &stu)
	fmt.Printf("%p\n", &stu.id)

	fmt.Printf("%p\n", &stu)
	//结构体成员地址
	fmt.Printf("%p\n", &stu.name)
	fmt.Printf("%p\n", &stu.id)
	fmt.Printf("%p\n", &stu.age)
	fmt.Printf("%p\n", &stu.sex)
}
func main0702() {
	var stu Student = Student{id: 101, name: "多啦A梦", age: 100, sex: "男"}

	var p *Student
	p = &stu

	//通过结构体指针间接操作结构体成员
	//(*p).name="大熊"
	//通过指针可以直接操作结构体成员
	p.name = "静香"
	p.age = 18
	p.sex = "女"

	fmt.Println(stu)
}
func main0703() {

	//结构体切片
	var stu []Student = make([]Student, 3)

	p := &stu //*[]Student  //结构体切片指针
	//stu[0]=Student{"小猪佩奇",1,10,"女"}
	(*p)[0] = Student{"小猪佩奇", 1, 10, "女"}
	(*p)[1] = Student{"野猪佩奇", 2, 15, "女"}
	(*p)[2] = Student{"猪刚鬣", 3, 1000, "男"}

	//append在切片长度后添加数据
	*p = append(*p, Student{"小猪佩奇", 1, 10, "女"})

	//fmt.Printf("%T\n",p)
	//fmt.Println(stu)

	for i := 0; i < len(*p); i++ {
		fmt.Println((*p)[i])
	}
}

8.多级指针

func main0801() {
	a := 10
	p := &a
	pp := &p  //二级指针  二级指针存储一级指针的地址
	p3 := &pp //三级指针 存储二级指针的地址
	//fmt.Println(p)
	//fmt.Println(&p)

	//一级指针的值
	//fmt.Println(*pp)
	//fmt.Println(p)
	//fmt.Println(&a)
	//变量a 的值
	fmt.Println(*p3)
	fmt.Println(**pp)
	fmt.Println(*p)
	fmt.Println(a)
	//fmt.Printf("%T\n",a)
	//fmt.Printf("%T\n",p)
	//fmt.Printf("%T\n",pp)
	//fmt.Printf("%T\n",ppp)

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值