Go语言中的指针

什么是指针

指针就是地址,指针变量就是存储地址的变量。 使用”%q"打印go语言带双引号的字符串,可以显示出空结果;%s与Println一样的结果
指针使用注意:
空指针:未初始化的指针。var p *int
野指针:用一片无效的地址空间来初始化
指针初始化:
使用new(type)函数初始化,默认为类型的默认值,在heap上申请一段空间;
使用&取地址运算符;
指针传参:值传递
传引用:将地址值作为函数参数,返回值传递。
传值:将实参的值拷贝一份给形参。
*p是解引用,或者称为间接引用 ,a是一个整型变量,p是一个整型指针变量,&a存的是a当前空间的地址,&p存的是p当前空间的地址,&是取地址运算符,返回的是操作数的内存地址;但是p存的是a的地址,*是间接寻址运算符,返回的是操作数所指定地址的变量的值。

初识指针

func main() {
	var a int = 10
	var b = &a
	fmt.Println("a的值为", a)
	fmt.Println("a的内存地址为", &a)
	fmt.Println("b的值为", b)
	//*指针
	fmt.Println("变量b指向内存地址中存储的数据", *b)
	*b = 20
	fmt.Println(a, *b)

}

指针的使用

func main() {
	var a int = 10
	fmt.Println(a)
	fmt.Println("a的内存地址", &a)
	//声明一个指针变量
	var p *int
	p = &a
	fmt.Println(&a)
	fmt.Printf("p 变量储存的指针地址:%p\n", p)
	fmt.Printf("p 变量的地址%p\n", &p)
	*p = 20
	fmt.Println(a)
	//在定义一个指针变量ptr ,来指向 指针变量p
	var ptr **int
	ptr = &p
	fmt.Printf("ptr 变量储存的指针地址:%p\n", ptr)
	fmt.Printf("ptr 变量自己的地址%p\n", &ptr)
	fmt.Printf("*ptr变量的值 %p\n", *ptr)
	fmt.Printf("*ptr 变量的地址的值%d\n", **ptr)

}
10
a的内存地址 0xc00001a0a8
0xc00001a0a8
p 变量储存的指针地址:0xc00001a0a8
p 变量的地址0xc00000a030
20
ptr 变量储存的指针地址:0xc00000a030
ptr 变量自己的地址0xc00000a038
*ptr变量的值 0xc00001a0a8
*ptr 变量的地址的值20

指针与数组

func main() {
	//数组指针
	arr1 := [4]int{1, 2, 3, 4}
	var p1 *[4]int
	p1 = &arr1
	fmt.Printf("p1->地址:%p\n", p1)
	fmt.Printf("p1地址:%p\n", &p1)
	fmt.Printf("p1->地址->值:%d\n", *p1)

	(*p1)[0] = 100
	fmt.Println(arr1)
	fmt.Println(*p1)

	//简化写法,指向谁,代表谁
	p1[0] = 200
	fmt.Println(arr1)
	fmt.Println(*p1)
	a := 1
	b := 1
	c := 1
	d := 1
	arr2 := [4]*int{&a, &b, &c, &d}
	fmt.Println(arr2)
	fmt.Println(*arr2[1])

}
p1->地址:0xc0000121c0
p1地址:0xc00000a028
p1->地址->值:[1 2 3 4]
[100 2 3 4]
[100 2 3 4]
[200 2 3 4]
[200 2 3 4]
[0xc00001a0a8 0xc00001a0e0 0xc00001a0e8 0xc00001a0f0]
1

指针与函数

func main() {
	ptr := f1()
	fmt.Printf("ptr的类型%T\n", ptr)
	fmt.Println("ptr的地址", &ptr)
	fmt.Println("ptr->指向地址的值", *ptr)
	fmt.Println(ptr[0])
	a := 10
	f2(&a)
	fmt.Println(a)
}

// 数组型函数指针
func f1() *[4]int {
	arr := [4]int{1, 2, 3, 4}
	return &arr
}
func f2(ptr *int) {
	fmt.Println("ptr", ptr)
	fmt.Println("*ptr", *ptr)
	*ptr = 100
}
ptr的类型*[4]int
ptr的地址 0xc00000a028
ptr->指向地址的值 [1 2 3 4]
1
ptr 0xc00001a0e0
*ptr 10
100

结构定义

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值