go语言渐入佳境[14]-指针
1
2
a :=10
fmt.Printf("a变量的地址为:%#X\n",&a)//a变量的地址为:0XC420092008
指针的声明
1
2
//声明
var p *int
空指针
1
2
3
if p==nil{
fmt.Println("p为空指针")
}
通过指针获取值
1
2
p = &a
fmt.Printf("p的类型为%T, p的值为:%v,p指向的int的值为:%v,a的值为:%d\n",p,p,*p,a)
通过指针修改值
1
2
*p = 99
fmt.Printf("p的类型为%T, p的值为:%v,p指向的int的值为:%v,a的值为:%d\n",p,p,*p,a)
完整例子1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main
import "fmt"
func main(){
//变量的地址
a :=10
fmt.Printf("a变量的地址为:%#X\n",&a)
//声明
var p *int
//空指针
if p==nil{
fmt.Println("p为空指针")
}
//通过指针获取值
p = &a
fmt.Printf("p的类型为%T, p的值为:%v,p指向的int的值为:%v,a的值为:%d\n",p,p,*p,a)
//通过指针修改值
*p = 99
fmt.Printf("p的类型为%T, p的值为:%v,p指向的int的值为:%v,a的值为:%d\n",p,p,*p,a)
}
指针作为函数参数
指针作为函数参数,修改原来的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
import "fmt"
func main() {
a := 10
fmt.Printf("1、变量a的内存地址是:%p ,值为:%v \n\n", &a, a)//10
b := &a
change(b)
fmt.Printf("3、change函数调用之后,变量a的内存地址是:%p ,值为:%v \n\n", &a, a)//20
change0(a)
fmt.Printf("5、change0函数调用之后,变量a的内存地址是:%p ,值为:%v \n\n", &a, a)//20
}
func change(a *int) {
fmt.Printf("2、change函数内,变量a的内存地址是:%p ,值为:%v \n\n", &a, a)//20
*a = 50
}
func change0(a int) {
fmt.Printf("4、change0函数内,变量a的内存地址是:%p ,值为:%v \n\n", &a, a)//20
a = 90
}
切片类型指针作为函数参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4}
fmt.Printf("1、变量a的内存地址是:%p ,值为:%v \n\n", &a, a)
modify(&a)
fmt.Printf("3、调用modify函数后,变量a的内存地址是:%p ,值为:%v \n\n", &a, a)
modify0(a)
fmt.Printf("5、调用modify0函数后,变量a的内存地址是:%p ,值为:%v \n", &a, a)
}
func modify(arr *[]int) {
fmt.Printf("2、modify函数中参数a的内存地址是:%p ,值为:%v \n", &arr, arr)
(*arr)[0] = 250
}
func modify0(arr []int) {
fmt.Printf("4、modify0函数中参数a的内存地址是:%p ,值为:%v \n", &arr, arr)
arr[0] = 99
}
指针作为函数参数例子2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
import "fmt"
func main() {
//定义两个局部变量
a, b := 100, 200
//返回值的写法实现数据交换
a, b = swap0(a, b)
fmt.Println("第一次交换后:" , a, b)
//使用指针实现交换
swap(&a, &b)
fmt.Println("第二次交换后:" , a, b)
}
//具有返回值的惯用写法,实现两个数据的交换
func swap0(x, y int) (int, int) {
return y, x
}
//使用指针作为参数的写法
func swap(x, y *int) {
*x, *y = *y, *x
}
指针数组
数组,数组中的元素存储的都是指针。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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.Println(*ptr[i])
}
for _,value :=range ptr {
fmt.Println(*value)
}
}
多级指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main
import "fmt"
func main() {
var a int
var ptr *int
var pptr **int
a = 123
//为指针赋值
ptr = &a
fmt.Println("ptr:" , ptr)
//为pptr赋值
pptr = &ptr
fmt.Println("pptr" , pptr)
//获取指针对应的值
fmt.Printf("变量 a = %d \n" , a)
fmt.Printf("指针变量 *ptr = %d \n" , *ptr)
fmt.Printf("指向到指针的变量 **pptr = %d \n" ,**pptr)
}
本文链接:https://dreamerjonson.com/2018/11/20/golang-14-pointer/
版权声明:本博客所有文章除特别声明外,均采用CC BY 4.0 CN协议许可协议。转载请注明出处!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。