【Go学习合集】进阶数据类型4 -------->指针

定义

概念定义

指针是一种特殊的数据类型,它允许我们引用变量的内存地址,从而直接修改指向对象的值

代码定义

package main

import "fmt"

func main() {
	// 第一种定义方式
	var p1 *int // 此时p1的值为nil
	// 第二种定义方式
	i := 10
	p2 := &i // 此时p2指向i的地址
	fmt.Println("p1 = ", p1)
	fmt.Println("p2 = ", p2)
	// fmt.Println(*p1) 因为p1的值为nil,所以会报错
	fmt.Println("*p2 = ", *p2)
}
-----------------------运行结果-------------------------
p1 =  <nil>
p2 =  0x140000ae018
*p2 =  10

想要解决的问题

  1. 内存管理
  • 高效内存使用:
    指针允许直接访问和操作内存地址,避免了对大数据结构的频繁复制。例如,在函数调用时,通过传递指针而不是整个数据结构,可以减少内存开销和提高性能。
  • 动态内存分配:
    通过指针,可以动态分配和释放内存,这对于管理生命周期不确定的数据非常有用。在Go中,尽管有垃圾回收机制,指针仍然在某些场景中帮助程序员更好地控制内存使用。
package main

import "fmt"

func allocateMemory() *int {
    p := new(int)  // 动态分配内存
    *p = 42
    return p
}

func main() {
    p := allocateMemory()
    fmt.Println(*p)
}
------------------------运行结果------------------------
42
  1. 共享和修改数据
  • 共享数据:
    指针可以用于在多个函数之间共享数据,而不是复制数据。通过传递指针,可以确保所有函数访问的是同一块数据,实现数据的共享和一致性。
  • 修改数据:
    函数参数通过指针传递,可以在函数内部修改传入的变量。例如,排序算法中的交换操作,链表的节点操作等。
package main

import "fmt"

func modifyValue(p *int) {
	*p = 100
}

func main() {
	var x int = 10
	fmt.Println("Before:", x)
	modifyValue(&x)
	fmt.Println("After:", x)
}
------------------------运行结果------------------------
Before: 10
After: 100
  1. 数据结构
  • 链表和树:
    指针是实现链表、树等数据结构的基础。
    在链表中,每个节点包含一个指向下一个节点的指针;在树结构中,每个节点包含指向其子节点的指针。
  • 复杂数据结构:
    指针允许创建更复杂的数据结构,如图、散列表等。
    这些数据结构依赖于节点间的相互引用,而指针提供了这种能力。
package main

import "fmt"

type Node struct {
	value int
	next  *Node
}

func main() {
	// 创建链表节点
	head := &Node{value: 1}
	head.next = &Node{value: 2}
	head.next.next = &Node{value: 3}

	// 遍历链表
	current := head
	for current != nil {
		fmt.Println(current.value)
		current = current.next
	}
}
------------------------运行结果------------------------
1
2
3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值