进制转换
二进制 |
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
",a) //int
15 fmt.Printf("a的数值是%v
",a) //123
16 fmt.Printf("a的地址是%p
",&a) //0x...
17
18
19
20 //修改a地址
21 //&a地址存在 apointer变量中 【这个代表 对数值取地址】
22 apointer :=&a
23 fmt.Printf("apinrter的类型是%T
",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 }