温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

go语言渐入佳境[14]-指针

发布时间:2020-06-15 22:25:48 阅读:165 作者:jonson_jackson 栏目:开发技术
GO开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

变量的地址

12
a :=10fmt.Printf("a变量的地址为:%#X\n",&a)//a变量的地址为:0XC420092008

指针的声明

12
//声明var p *int

空指针

123
if p==nil{  fmt.Println("p为空指针")}

通过指针获取值

12
p = &afmt.Printf("p的类型为%T, p的值为:%v,p指向的int的值为:%v,a的值为:%d\n",p,p,*p,a)

通过指针修改值

12
*p = 99fmt.Printf("p的类型为%T, p的值为:%v,p指向的int的值为:%v,a的值为:%d\n",p,p,*p,a)

完整例子1

123456789101112131415161718192021222324252627282930
package mainimport "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)}

指针作为函数参数

指针作为函数参数,修改原来的值:

1234567891011121314151617181920212223242526
package mainimport "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}

切片类型指针作为函数参数

123456789101112131415161718192021222324
package mainimport "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

1234567891011121314151617181920212223242526
package mainimport "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}

指针数组

数组,数组中的元素存储的都是指针。

1234567891011121314151617181920212223242526272829303132
package mainimport "fmt"const COUNT int = 4func 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)	}}

多级指针

1234567891011121314151617181920212223
package mainimport "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协议 许可协议。转载请注明出处!

go语言渐入佳境[14]-指针

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×