go七:指针
package main
import "fmt"
func main() {
a := 120
//声明一个指针变量
var ip *int
//给指针变量赋值:将变量a的内存地址赋值给ip
ip = &a
//打印a的类型和值
fmt.Printf("a的类型是%T,值是%v\n", a, a) //int 120
fmt.Printf("&a的类型是%T,值是%v\n", &a, &a) //*int 0xc42154004145
fmt.Printf("ip的类型是%T,值是%v\n", ip, ip) //*int 0xc42154004145
fmt.Printf("*ip的类型是%T,值是%v\n", *ip, *ip) //int 120
fmt.Printf("*&a的类型是%T,值是%v\n", *&a, *&a) //int 120
fmt.Println("===========")
fmt.Println(a, &a, *&a) //120 0xc04204c080 120
fmt.Println(ip, &ip, *ip, *(&ip), &(*ip)) //0xc04204c080 0xc04206c018 120 0xc04204c080 0xc04204c080
}
package main
import "fmt"
type Student struct {
name string
age int
married bool
sex int8
}
func main() {
s1 := Student{"candy", 35,true, 1 }
s2 := Student{"sunny", 30,false, 0 }
//定义一个指针
var a *Student = &s1
var b *Student = &s2
fmt.Printf("s1类型为%T, 值为%v\n", s1, s1)
fmt.Println("================\n")
fmt.Printf("a类型为%T, 值为%v\n", a, a)
fmt.Printf("b类型为%T, 值为%v\n", b, b)
fmt.Println("================\n")
fmt.Printf("*a类型为%T, 值为%v\n", *a, *a)
fmt.Printf("*b类型为%T, 值为%v\n", *b, *b)
}
s1类型为main.Student, 值为{candy 35 true 1}
================
a类型为*main.Student, 值为&{candy 35 true 1}
b类型为*main.Student, 值为&{sunny 30 false 0}
================
*a类型为main.Student, 值为{candy 35 true 1}
*b类型为main.Student, 值为{sunny 30 false 0}
操作指针:
指针作为函数参数传递
package main
import "fmt"
func main() {
a := 10
fmt.Println("函数调用前的a值", a) //10
b := &a
change(b)
fmt.Println("函数调用之后的a值", a) //20
}
func change(num *int) {
*num = 20
}
package main
import "fmt"
func main() {
//定义两个局部变量
a, b := 100, 200
a, b = swap0(a, b)
fmt.Println("返回值的写法实现的数据交换a, b: ", a, b) //200 100
swap(&a, &b)
fmt.Println("使用指针的写法实现的数据交换a, b: ", a, b) //100 200
}
//传统写法,具有返回值的惯用写,实现两个数据的交换
func swap0(x, y int) (int, int) {
return y, x
}
//使用指针作为参数的写,无需返回值
func swap(x, y *int) {
*x, *y = *y, *x
}
切片指针作为函数参数。但惯用用法,使用切片作为函数参数,而不是切片的指针作为函数参数
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4}
fmt.Println("调用函数前的切片为:", a) //[1 2 3 4]
modify(&a)
fmt.Println("调用函数后的切片为:", a) //[600 2 3 4]
}
func modify(arr *[]int) {
(*arr)[0] = 600
}
指针数组:元素为指针类型的数组
package main
import "fmt"
const COUNT int = 4
func main() {
//数组
a := [COUNT]string{"abc", "ABC", "123", "一二三"}
//查看数组指针的类型和值
fmt.Printf("数组的指针:%T, %v\n", a, a)
//定义指针数组
var ptr [COUNT]*string
fmt.Printf("指针数组:%T, %v\n", ptr, ptr)
for i := 0; i < COUNT; i++ {
//将数组中每个元素的地址,依次赋值给指针数组的每个元素
ptr[i] = &a[i]
}
fmt.Printf("赋值后的指针数组:%T, %v\n", ptr, ptr)
fmt.Println(ptr[0])
//根据指针数组元素的每个地址获取该 地址所指向的元素的真实数值
for i := 0; i < COUNT; i++ {
fmt.Printf("赋值后的指针数组指向的真实数据:%T, %v\n", *ptr[i], *ptr[i])
}
fmt.Printf("=============\n")
for _, value := range ptr {
fmt.Printf("赋值后的指针数组指向的真实数据:%T, %v\n", *value, *value)
}
}
数组的指针:[4]string, [abc ABC 123 一二三] 指针数组:[4]*string, [<nil> <nil> <nil> <nil>] 赋值后的指针数组:[4]*string, [0xc042048080 0xc042048090 0xc0420480a0 0xc0420480b0] 0xc042048080 赋值后的指针数组指向的真实数据:string, abc 赋值后的指针数组指向的真实数据:string, ABC 赋值后的指针数组指向的真实数据:string, 123 赋值后的指针数组指向的真实数据:string, 一二三 ============= 赋值后的指针数组指向的真实数据:string, abc 赋值后的指针数组指向的真实数据:string, ABC 赋值后的指针数组指向的真实数据:string, 123 赋值后的指针数组指向的真实数据:string, 一二三
指针的指针:
package main import "fmt" func main() { var a int var ptr *int var pptr **int a = 123 //为指针赋值 ptr = &a //为指针的指针赋值 pptr = &ptr fmt.Println("a: ", a, "ptr: ", ptr, "pptr: ", pptr) //a: 123 ptr: 0xc04204c080 pptr: 0xc04206c018 //获取指针对应的值 fmt.Printf("变量a=%d \n", a) fmt.Printf("指针变量*ptr=%d \n", *ptr) fmt.Printf("指针的指针变量**pptr=%d \n", **pptr) }
posted on 2018-03-29 18:43 myworldworld 阅读(130) 评论(0) 收藏 举报