GoLang学习笔记(十六)指针

版权声明:如需转载、粘贴内容,必须在转载和粘贴文中标明文章内容出至 https://blog.csdn.net/ynzcxx/article/details/84784536

指针是存储另一个变量的内存地址的变量。
变量是一种使用方便的占位符,变量都只想计算机的内存地址。
一个指针变量可以指向任何一个值的内存地址
GoLang获取一个变量的地址,在一个变量前使用&符号,会返回该变量的内存地址.
GoLang的指针是不能参与运算的。
声明指针,*T是指针变量的类型,它指向T类型的值。
格式:var 指针变量名 *指针类型(如var ip *int)
在一个指针变量前加上一个*符号,则获取该指针变量真实的值。

来一个例子,获取变量地址:

func getVariableAddr() {
	a := 10
	fmt.Printf("变量的地址:%x \n", &a)
	arr := []int{1, 2, 3, 4, 5}
	fmt.Printf("变量的地址:%x \n", &arr)
}

运行后可获得该变量的地址,接着申明指针变量的例子:

func declarePointer() {
	//定义一个实际变量
	a := 100
	//申明一个指针变量
	var ip *int
	//给指针变量赋值
	ip = &a
	//获取指针变量的值
	fmt.Println(ip)
	//获取指针变量内存地址的实际值
	fmt.Println(*ip)
}

声明一个复合变量的指针:

先声明一个复合类型:

type student struct {
	name    string
	age     int
	married bool
	sex     int8
}

接着来做复合变量的指针:

func complexType1() {
	s1 := student{"yoni", 37, true, 1}
	s2 := student{"oscar", 35, true, 0}

	var a *student = &s1
	var b *student = &s2

	fmt.Println("\n-------------")
	fmt.Printf("S1的类型为%T,值为%v \n", s1, s1)
	fmt.Printf("S2的类型为%T,值为%v \n", s2, s2)

	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)

	fmt.Println("\n-------------")
	fmt.Println(s1.name, s1.age, s1.married, s1.sex)
	fmt.Println(a.name, a.age, a.married, a.sex)

	fmt.Println("\n-------------")
	fmt.Println((*a).name, (*a).age, (*a).married, (*a).sex)
	fmt.Println(&a.name, &a.age, &a.married, &a.sex)
}

空指针的例子:

func nullPointer() {
	var pval *int
	fmt.Printf("pval指针的类型为%T,值为%v \n", pval, pval)
	if pval == nil {
		fmt.Println("prval为空指针")
	} else {
		fmt.Println("pval有指针")
	}
}

通过指针改变变量值的例子:

func pointer1() {
	a := 10
	var b *int = &a
	fmt.Printf("b的类型%T,数值%v \n", b, b)
	fmt.Println("a的地址", b)
	fmt.Println("*b的值", *b)
	*b++
	fmt.Println("a的值", a)
}

将指针作为函数参数:

func change1() {
	a := 10
	fmt.Println("调用函数前的A值", a)
	b := &a
	dochange1(b)
	fmt.Println("调用函数后的A值", a)
}

func dochange1(num *int) {
	*num = 50
}

将两个值数据互换的例子:

func swap() {
    a,b := 100,200
    //传统写法
    a,b = doSwap1(a,b)
	fmt.Println("传统交换后:",a,b)
    //指针写法
    doSwap2(&a,&b)
    fmt.Println("指针交换后:",a,b)
}

func doSwap1(x, y int) (int, int) {
	return y, x
}

func doSwap2(x, y *int) {
	*x, *y = *y, *x
}

对切片进行指针操作:

func modify() {
    arr := []int {1,2,3,4,5}
    doModify(&arr)
    fmt.Println(arr)
}

func doModify(arr *[]int){
	(*arr)[0] = 500
}

对切片指针进行操作,虽然可以用指针来修改,但使用指针不是最好的办法。

指针的指针:

func pointerPointer(){
	var a int
	var ptr *int
	var pptr **int

	a = 123
    //为指针赋值
	ptr = &a
	fmt.Println("ptr:",ptr)
    //为指针的指针赋值
	pptr = &ptr
	fmt.Println("pptr:",pptr)
}

猜你喜欢

转载自blog.csdn.net/ynzcxx/article/details/84784536
今日推荐