GO语言的指针声明:
var varName * varType
C语言指针声明:
varType * varName
Go 空指针:
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
C语言空指针:
值为 NULL 0
Go 语言允许向函数传递指针,只需要在函数定义的参数上设置为指针类型即可,这个与C语言类似。
以下实例演示了如何向函数传递指针,并在函数调用后修改函数内的值,注意最后一个未能修改成功,因为是值传递,就是拷贝。
package main
import "fmt"
/*仿照C语言写的交换函数*/
func swap_C(x *int, y *int) {
var temp int
temp = *x /* 保存 x 地址的值 */
*x = *y /* 将 y 赋值给 x */
*y = temp /* 将 temp 赋值给 y */
}
/*GO的多重赋值,修改的是传入地址的内容*/
func swap_GO(a *int, b *int) {
*a, *b = *b, *a
}
/*GO 的多重赋值,直接交换值*/
func swap_GO_mini(a int, b int) {
a, b = b, a
}
func main() {
/* 定义局部变量 */
var a int = 100
var b int = 200
fmt.Printf("交换前 a 的值 : %d ,a 的地址:%x\n", a, &a)
fmt.Printf("交换前 b 的值 : %d,b的地址:%x \n", b, &b)
swap_C(&a, &b)
fmt.Printf("交换后 a 的值 : %d ,a 的地址:%x\n", a, &a)
fmt.Printf("交换后 b 的值 : %d,b的地址:%x \n", b, &b)
fmt.Printf("*************************************\n")
/* 定义局部变量 */
var c int = 300
var d int = 400
fmt.Printf("交换前 c 的值 : %d ,c 的地址:%x\n", c, &c)
fmt.Printf("交换前 d 的值 : %d ,d的地址:%x \n", d, &d)
swap_GO(&c, &d)
fmt.Printf("交换后 c 的值 : %d ,d 的地址:%x\n", c, &c)
fmt.Printf("交换后 d 的值 : %d,d的地址:%x \n", d, &d)
fmt.Printf("*************************************\n")
/* 定义局部变量 */
var e int = 500
var f int = 600
fmt.Printf("交换前 e 的值 : %d ,e 的地址:%x\n", c, &e)
fmt.Printf("交换前 f 的值 : %d ,f的地址:%x \n", d, &f)
swap_GO_mini(e, f)
fmt.Printf("交换后 e 的值 : %d ,e 的地址:%x\n", c, &e)
fmt.Printf("交换后 f 的值 : %d,f的地址:%x \n", d, &f)
}
API server listening at: 127.0.0.1:9101
交换前 a 的值 : 100 ,a 的地址:c0000a8090
交换前 b 的值 : 200,b的地址:c0000a8098
交换后 a 的值 : 200 ,a 的地址:c0000a8090
交换后 b 的值 : 100,b的地址:c0000a8098
*************************************
交换前 c 的值 : 300 ,c 的地址:c0000a80d0
交换前 d 的值 : 400 ,d的地址:c0000a80d8
交换后 c 的值 : 400 ,d 的地址:c0000a80d0
交换后 d 的值 : 300,d的地址:c0000a80d8
*************************************
交换前 e 的值 : 400 ,e 的地址:c0000a8100
交换前 f 的值 : 300 ,f的地址:c0000a8108
交换后 e 的值 : 400 ,e 的地址:c0000a8100
交换后 f 的值 : 300,f的地址:c0000a8108