指针
进制转换
二进制 | 0 | 1 | 10 | 11 | 100 | ... | 1001 | 1010 | 1011 | 1100 | |||||||||
十进制 | 0 | 1 | 2 | 3 | 4 | ... | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 25 | 29 | |||
十六进制 | 0 | 1 | 2 | 3 | 4 | ... | 9 | A | B | C | F | 0x10 | 0x11 | 0x12 | 0x19 | 0x1A |
指针
/*
指针就是地址
每个页上都有指针和页数据 指针其实就是记录数据的 数据头,就像每个屋子都有一个门牌号一样。 指针可以套指针,别管怎么指,最终还会到最初的页数据那去。 如果是int 类型的数据 那么这个指针就是 *int 类型的指针。
*/
1 /* 2 &value 对数值 取地址 3 *ptr 对地址 取数值 4 5 */ 6 package main 7 8 import ( 9 "fmt" 10 ) 11 12 func main(){ 13 var a int = 123 14 fmt.Printf("a的类型是%T\n",a) //int 15 fmt.Printf("a的数值是%v\n",a) //123 16 fmt.Printf("a的地址是%p\n",&a) //0x... 17 18 19 20 //修改a地址 21 //&a地址存在 apointer变量中 【这个代表 对数值取地址】 22 apointer :=&a 23 fmt.Printf("apinrter的类型是%T\n",apointer) //*int 24 25 //将456丢入a的地址中 【这个代表 对地址 取数值】 26 *apointer =456 27 fmt.Println(*apointer) //456 28 //a也变成了456 29 fmt.Println(a) //456 30 }
1 package main 2 3 import "fmt" 4 5 func main(){ 6 var x = 456 7 8 //定义整型指针(存储整型数据的地址),默认赋值为空nil 9 var xx *int 10 11 //xx指向x的地址 12 xx = &x 13 14 //将xx指向的地址中的数值 改为 789 15 *xx = 789 16 17 fmt.Println(*xx) //xx地址中的数值是 789 18 fmt.Println(&x) //x的地址内容是0xc00004c080 19 fmt.Println(x) //x的数值是789 20 fmt.Println(*xx==x) //xx地址中的数值= x的数值 true 21 fmt.Println(xx ==&x) //xx指针变量的数值= x地址的内容。true 22 }
指针的指针
/* 专门一个地址里 存储的内容是 另外一个指针的地址。 那么这个地址就叫指针的指针。 比如 a <-- b的值是a的指针<-----C的值是b的指针 *c = 取c的数值 也就是b的指针地址 **c = 取c的数值 在继续取b的数值 也就是a的值。 */
1 package main 2 3 import "fmt" 4 5 func main(){ 6 var x = 123 7 var p *int = &x //x的指针给p 8 pp := &p //在把p的指针给pp <----- 指针的指针 9 10 fmt.Println(pp) //0xc000006028 11 12 fmt.Println(*p) //123 13 fmt.Println(*(*pp)) //123 14 fmt.Println(**pp) //123 15 16 17 }