指针
一、简介
指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于Java语言和C/C++语言之间,它既没有想Java语言那样取消了代码对指针的直接操作的能力,也避免了C/C++语言中由于对指针的滥用而造成的安全和可靠性问题。
实践
package main
import "fmt"
func main(){
//定义a int
a:=100
fmt.Printf("a = %v , &a = %v\n",a,&a)
// 定义p为a的内存地址
p := &a
fmt.Printf("p = %v\n",p)
// 修改*p的值,此时a的值也会被修改
*p = 300
fmt.Printf("a = %v , &a = %v\n",a,&a)
}
package main
import "fmt"
func main(){
var a int = 10
fmt.Printf("a = %v,&a = %v\n",a,&a) //操作符 "&" 取变量地址
var p *int = nil //声明一个变量p, 类型为 *int, 指针类型
fmt.Printf("p = %v,&p = %v\n",p,&p)
p = &a
fmt.Printf("p = %v,&p = %v\n",p,&p)
fmt.Printf("a = %v,&a = %v\n",a,&a)
*p = 20 //*p操作指针所指向的内存,即为a
fmt.Printf("a = %v, *p = %v",a,*p)
}
new函数
表达式new(T)将创建一个T类型的匿名变量,所做的是为T类型的新值分配并清零一块内存空间,然后将这块内存空间的地址作为结果返回,而这个结果就是指向这个新的T类型值的指针值,返回的指针类型为*T。
package main
import "fmt"
func main() {
var p1 *int
p1 = new(int) //p1为*int 类型, 指向匿名的int变量
fmt.Println("*p1 = ", *p1) //*p1 = 0
p2 := new(int) //p2为*int 类型, 指向匿名的int变量
*p2 = 111
fmt.Println("*p2 = ", *p2) //*p1 = 111
}
// //结果
// *p1 = 0
// *p2 = 111
// //
指针做函数参数
值传递
传统情况
package main
import "fmt"
func test(a, b int) {
a, b = b, a
fmt.Printf("test函数:a = %v,b = %v\n", a, b)
}
func main() {
a := 10
b := 20
test(a, b)
fmt.Printf("main函数: a = %v,b = %v\n", a, b)
}
结果:
test函数:a = 20,b = 10
main函数: a = 10,b = 20
显然是与我们预期的是不符合的
使用指针:
package main
import "fmt"
func test01(a, b *int) {
*a, *b = *b, *a
}
func test(a, b int) {
a, b = b, a
}
func main() {
a := 10
b := 20
fmt.Printf("调用函数之前: a = %v,b = %v\n", a, b)
test(a, b)
fmt.Printf("调用传递常量函数后: a = %v,b = %v\n", a, b)
fmt.Println("未达到翻转赋值效果")
test01(&a, &b)
fmt.Printf("调用传递指针变量后: a = %v,b = %v\n", a, b)
}

本文介绍了Go语言中的指针概念,展示了如何定义和使用指针,包括通过指针修改变量值、使用`new`函数创建指针以及指针在函数参数传递中的作用。通过实例代码解释了值传递与指针传递的区别,强调了指针在Go语言中的安全性和实用性。
400

被折叠的 条评论
为什么被折叠?



