博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go学习随笔(五)指针\指针的指针\指针数组\指针传递函数
阅读量:3905 次
发布时间:2019-05-23

本文共 2379 字,大约阅读时间需要 7 分钟。

大家都知道所有的指针变量都是一个内存位置,每个内存位置都有其定义的地址,可以使用&运算符来访问它,这个运算符表示内存中的地址。

func main() {	a := 10	fmt.Printf("%x\n", &a) //打印变量a的地址	返回:c0000140a8}

指针概念:指针是一个变量,其值是另一个变量的地址,即存储器位置的直接地址。

 Go语言使用 * 运算符来取得指向指针存储的内存地址所对应的值(指针的格式化为%p),Go语言指针不支持运算,也不支持     -> 运算符,可以直接用,访问目标成员(有涉及到struct以后再写)

func main() {	a := 10	ip := &a	value := *ip	fmt.Printf("a的地址:%x\n", &a)	fmt.Printf("ip的地址:%x\n", &ip)	fmt.Printf("ip的值:%d\n", *ip)	fmt.Printf("value的值:%d", value)}结果:a的地址:c0000140a8ip的地址:c000006028ip的值:10value的值:10

nil指针

当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr。nil指针是在几个标准库中定义的值为零的常量。

注意:对一个空指针的方向引用是不合法的,并会使程序奔溃。(var p *int = nil; *p = 10)

 

func main() {	var ptr *int	fmt.Printf("prt的值是:%x\n", ptr)	if ptr != nil {		fmt.Println("非空")	} else {		fmt.Println("空")	}}prt的值是:0空

指针的指针

func main() {	var a *int //定义一个a指针,指向nil	aP := &a   //空指针a的指针	fmt.Printf("a-->nil:%x\n", a)	fmt.Printf("a指针的内存地址:%x\n", &a)	fmt.Printf("aP-->a:%x\n", aP)	fmt.Printf("aP-->a-->nil(指针aP指向的指针a的内存地址):%x\n", *aP)}结果:a-->nil:0a指针的内存地址:c000006028aP-->a:c000006028aP-->a-->nil(指针aP指向的指针a的内存地址):0

如果定义一个指针的指针,可以这样定义:var ptr **int;

 

func main() {	a := 10	aP := &a	aPP := &aP	fmt.Printf("a:%d\n", a)	fmt.Printf("aP:%x\n", aP)	fmt.Printf("*aP:%d\n", *aP)	fmt.Printf("aPP:%x\n", aPP)	fmt.Printf("*aPP:%x\n", *aPP)	fmt.Printf("**aPP:%d\n", **aPP)}结果:a:10aP:c0000140a8        //ap是a的内存地址*aP:10              aPP:c000006028       //app是ap的内存地址*aPP:c0000140a8   //这里的是ap的地址**aPP:10            //这才能拿到a的值

 

提醒各位一句:禁止套娃!!!

 指针数组

 指向数组的指针也会有多个值,确切说是指针数组有多个值

const MAX int = 3//使用三个整数,将他们存储在指针数组中func main() {	a := []int{10, 100, 200} //初始化a数组	var ptr [MAX]*int        //这里将ptr声明为一个指针数组,数组长度为MAX,ptr中的每个元素现在保存一个指向int值的指针	for i := 0; i < MAX; i++ {		ptr[i] = &a[i]		fmt.Printf("a[%d]的地址:%x\n", i, ptr[i])	}	for i := 0; i < MAX; i++ {		fmt.Printf("a[%d]的值是:%d\n", i, *ptr[i])	}}结果:a[0]的地址:c00007e120a[1]的地址:c00007e128a[2]的地址:c00007e130a[0]的值是:10a[1]的值是:100a[2]的值是:200

指针传递给函数

func main() {	a := 100	b := 200	fmt.Printf("交换之前a的值为:%d\n", a)	fmt.Printf("交换之前b的值为:%d\n", b)	//把a和b的地址传递给函数,然后a和b的地址交换,最终实现两个值交换	swap(&a, &b)	fmt.Printf("交换之后的a值为:%d\n", a)	fmt.Printf("交换之后的b值为:%d\n", b)}func swap(x *int, y *int) {	fmt.Printf("原a的地址:%x\n", &x)	fmt.Printf("原b的地址:%x\n", &y)	fmt.Printf("原a:%d\n", *x)	fmt.Printf("原b:%d\n", *y)	var temp int	temp = *x	*x = *y	*y = temp}结果:交换之前a的值为:100交换之前b的值为:200原a的地址:c00009e020原b的地址:c00009e028原a:100原b:200交换之后的a值为:200交换之后的b值为:100

 

转载地址:http://gpqen.baihongyu.com/

你可能感兴趣的文章
Round robin
查看>>
consistent hashing
查看>>
Crawler
查看>>
Bloom Filter
查看>>
Dynamic Programming
查看>>
Python hashmap
查看>>
python 切片
查看>>
interview sum
查看>>
HTTPs Control
查看>>
Prenatal Vitamin Brands
查看>>
Python sort list customisation
查看>>
Python sort dict by value
查看>>
ASCII - American Standard Code for Information Interchange
查看>>
Django short url
查看>>
Tech Blog
查看>>
Logon System Design
查看>>
Python yield
查看>>
Sina API OAuth
查看>>
Python supervisor
查看>>
dict & set
查看>>