Go by Example中文版-指针

Go by Example 中文版 :指针

Go 支持指针,允许在程序中通过引用传递值或者数据结构。

相关程序示例如下:

package main
import "fmt"

// 我们将通过两个函数:zeroval 和 zeroptr 来比较指针和值类型的不同。zeroval 有一个 int 型参数,所以使用值传递。zeroval 将从调用它的那个函数中得到一个 ival形参的拷贝。
func zeroval(ival int) {
    ival = 0
}

// zeroptr 有一和上面不同的 *int 参数,意味着它用了一个 int指针。函数体内的 *iptr 接着解引用 这个指针,从它内存地址得到这个地址对应的当前值。对一个解引用的指针赋值将会改变这个指针引用的真实地址的值。
func zeroptr(iptr *int) {
    *iptr = 0
}
func main() {
    i := 1
    fmt.Println("initial:", i)
    zeroval(i)
		fmt.Println("zeroval:", i)
		
		// 通过 &i 语法来取得 i 的内存地址,例如一个变量i 的指针。
    zeroptr(&i)
		fmt.Println("zeroptr:", i)
		
		// 指针也是可以被打印的。
    fmt.Println("pointer:", &i)
}

zeroval 在 main 函数中不能改变 i 的值, 但是 zeroptr 可以,因为它有这个变量的内存地址的引用。

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

使用指针交换两个整数的示例程序

go中的指针和C/C++中的指针是类似的,通过值传递是无法交换两个整数的,但是通过指针却可以。

通过值传递交换两个整数
// 通过值传递是无法交换两个整数的
func swapByVal(a int, b int) {
	var temp int
	temp = a
	a = b
	b = temp
}
使用指针交换两个整数
// 通过指针可以交换两个整数
func swapByPointer(pA *int, pB *int) {
	var pTemp int
	pTemp = *pA
	*pA = *pB
	*pB = pTemp
}

完整的示例程序代码如下:

package main

import "fmt"

// 通过值传递是无法交换两个整数的
func swapByVal(a int, b int) {
	var temp int
	temp = a
	a = b
	b = temp
}

// 通过指针可以交换两个整数
func swapByPointer(pA *int, pB *int) {
	var pTemp int
	pTemp = *pA
	*pA = *pB
	*pB = pTemp
}

func main() {
	var a, b int = 10, 20
	fmt.Println("初始化前,a=", b, ",b=", b)
	swapByVal(a, b)
	fmt.Println("调用swapByVal(a,b)函数后,a=", a, ",b=", b)
	swapByPointer(&a, &b)
	fmt.Println("调用swapByPointer(&a, &b)函数后,a=", a, ",b=", b)
}

swap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值