当潜入GO语言时,使用指针通常是初学者更复杂且令人困惑的概念之一。但是,它们是GO类型系统的重要方面,为内存管理和数据操纵提供了强大的工具。这篇博客文章阐明了指针的目的和用法。
什么是指数?
从最简单的意义上讲,指针是一个存储另一个变量的内存地址的变量。它没有存储变量的实际值,而是包含一个“地址”,其中该值存储在内存中。这个概念并不是唯一的,它也被广泛用于C和C ++等其他语言。
让我们以一些现实生活的例子来理解指针。考虑一个图书馆,里面充满了各种书籍。每本书都可以被视为具有一种善良物质(尊敬)的变量。目前,要了解一本特定的书,您可以利用图书馆的目录,这为您提供了书的区域 - 它在哪个架子上,什么行,什么位置以及什么位置。这个目录就像指针。它不包含本书的实际实质(数据),但确实包含有关如何发现该书的信息(数据的内存地址)。
让我们看看在这种情况下使用指针的操作如何工作:
声明指针:就像在目录中有一个空条目,您可以在其中输入新书的位置。
分配指针:这是相同 输入 的确切位置<> /strong> book
使用指针:这是相似 使用目录条目找到 a a
通过指针更改价值:假设您想替换一本书 place place 另一个。 首先 使用目录(指针) to strong> 位置,然后更换书籍(值)。在目录中,位置(指针) do 不是 更改,,而是内容 工作簿 (内存 地址 value) 更改。
我希望这个真实的示例有助于简化您的指针概念!
宣布指针:
在GO中,使用 *
符号声明指针,然后使用存储值的类型。例如,将通往整数的指针写为 *int
,而将字符串的指针写成 *string
。
var p *int
var q *string
在此代码中, p
和 q
分别是INT和字符串的指示。但是,它们是非初始化的,因此,它们指向 nil
。
使用指针:
当我们开始使用它们来引用和操纵变量时,指针的力量会闪耀。 &
操作员用于获取变量的地址。
让我们说明这一点:
x := 5
p := &x
fmt.Println(p) // Outputs: 0xc0000160b8 (this will differ each run)
在这里,p
是x
的指针。它存储x
的内存地址。每次运行程序时,实际地址都会有所不同。
提示指针:
要使该值存储在特定的内存地址中,我们将取消指针。这是通过将指针变量与*
运算符相结合来实现的。这个过程被称为“删除”。
x := 5
p := &x
fmt.Println(*p) // Outputs: 5
在上面的示例中,*p
为我们提供了存储在内存位置的值p
指向的值,即5
。
通过指针改变价值:
指针的主要用途之一是直接在内存中操纵数据。由于指针存储了变量的地址,因此在该地址上更改数据会更改原始变量的值。
x := 5
p := &x
*p = 10
fmt.Println(x) // Outputs: 10
在这里,*p = 10
更改了p
指向的内存地址的值。由于p
指向x
,因此x
的值更改为10
。
功能指针:
使用功能时,指针变得非常方便。它们允许函数直接修改变量,从而导致有效的内存使用。没有指针,GO将值按值将值传递给函数,这意味着已制作值的副本,而原始值则没有变化。
func change(val int) {
val = 10
}
x := 5
change(x)
fmt.Println(x) // Outputs: 5
在上面的示例中,函数change
不会改变x
,因为go按值通过x
,
不是参考。
要直接更改x
,我们使用指针:
func change(val *int) {
*val = 10
}
x := 5
change(&x)
fmt.Println(x) // Outputs: 10
现在,函数change
通过其内存地址直接修改x
。该原理对于操纵大型结构非常有用,因为它有助于避免不必要的数据重复并提高代码效率。
结论 :
一开始,指针的概念可能会有些不知所措,但它们提供了一种能够管理和操纵GO中数据的工具。通过了解如何声明,使用和退出指针,您将解决直接内存访问的控制,以更熟练和适应性。