Go的指针

1、指针概念

指针也是一个变量,但它是一种特殊的变量,因为它存储的数据不仅仅是一个普通的值,如简单的整数或字符串,而是另一个变量的内存地址,如下图:
在这里插入图片描述

2、指针定义

package main

import "fmt"

func main() {

	var a int = 10
	var p *int
	p = &a
	fmt.Printf("%p\n", &a)
	fmt.Printf("%p\n", p)
	fmt.Printf("%d\n", *p)
}

输出结果:

0xc0000ac058
0xc0000ac058
10

注意事项:
在这里插入图片描述

3、new函数使用

package main

import "fmt"

func main() {
	var p *int
	p = new(int)
	*p = 67
	fmt.Println(*p)
}

4、指针作为函数参数

交互a、b的值

package main

import "fmt"

//func swap(a int, b int) {
//	a, b = b, a
//}
//函数参数为指针类型
func swap(a *int, b *int) {

	//*a  值
	//*a, *b = *b, *a
	temp := *a
	*a = *b
	*b = temp
}

func main() {

	a := 10
	b := 20
	//不能交换a b 的值  值传递
	//swap(a,b)
	//指针作为函数参数是地址传递
	swap(&a, &b)

	fmt.Println(a)
	fmt.Println(b)
}

输出结果:

20
10

5、数组指针

package main

import "fmt"

func main() {

	nums := [5]int{1, 2, 3, 4, 5}
	var p *[5]int
	p = &nums
	fmt.Println(*p)
	fmt.Println((*p)[0])

	updateArr(p)
	fmt.Println(p[0])
}

func updateArr(p *[5]int) {
	p[0] = 100
}

输出结果:

[1 2 3 4 5]
1  
100

6、指针数组

指针数组指的是一个数组中存储的都是指针(也就是地址)。也就是一个存储了地址的数组。

package main

import "fmt"

func main() {
	var p [2]*int
	var i int = 10
	var j int = 20
	p[0] = &i
	p[1] = &j
	fmt.Println(p)
	fmt.Println(*p[0])
}

输出结果:

[0xc0000120b8 0xc0000120d0]
10

7、切片指针

package main

import "fmt"

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

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

	fmt.Printf("slice 的地址 %p\n", &slice[0])
	fmt.Printf("p 的地址 %p\n", p)
	fmt.Printf("*p 的地址%p\n", *p)

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

	fmt.Printf("append后slice 的地址%p\n", slice)
	fmt.Println(slice)
}

输出结果:

slice 的地址 0xc00000a390
p 的地址 0xc000004078           
*p 的地址0xc00000a390           
append后slice 的地址0xc000014140
[1 2 3 4 5 6 7 8 9 10]    

8、切片指针作为函数参数

package main

import "fmt"

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

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

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

输出结果:

0xc00012a090
0xc000152030 
[1 2 3 4 5 6]

9、指针切片

package main

import "fmt"

func main() {
	//指针切片
	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)
	}
}

输出结果:

[0xc0000120b8 0xc0000120d0 0xc0000120d8 0xc0000120e0]
0 10
1 20
2 30
3 40

10、结构体指针

package main

import "fmt"

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

func updateStu(stu *Student) {
	stu.age = 21
}

func main() {
	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)

	updateStu(p)
	fmt.Println(*p)

	fmt.Println((*p).name)
	fmt.Println(p.name)

}

输出结果:

{静香 101 18}
{静香 101 21}
静香
静香

11、多级指针

package main

import "fmt"

var pp **int

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

	//一级指针的值
	fmt.Println(*pp)
	fmt.Println(p)
	fmt.Println(&a)
	println()

	//变量a 的值
	fmt.Println(*p3)
	fmt.Println(**pp)
	fmt.Println(*p)
	fmt.Println(a)
	println()

	fmt.Printf("%T\n", a)
	fmt.Printf("%T\n", p)
	fmt.Printf("%T\n", pp)

}

输出结果:

0xc0000120b8
0xc000006028
            
0xc0000120b8
0xc0000120b8
0xc0000120b8
            
0xc000006028
10          
10          
10          
            
int         
*int        
**int       
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值