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) |
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} |
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协议 许可协议。转载请注明出处!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。