ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## **1:基本介绍** 1)基本数据类型,变量存的就是值,也叫值类型 2)获取变量的地址,用&,比如: var num int,获取num的地址: &num 分析一下基本数据类型在内存的布局. ![](https://img.kancloud.cn/34/4d/344d861794b82ff5e93f8e2c5d07d900_1046x170.png) 3)指针类型,指针变量存的是一个地址, 这个地址指向的空间存的才是值 比如。`var ptr *int = &num` 举例说明: 指针在内存的布局. ``` package main import ( "fmt" ) func main(){ var i = 10 fmt.Println(&i) } ``` **运行结果** `0xc000014060` ``` package main import ( "fmt" ) func main(){ var i = 10 fmt.Println(&i) var per *int = &i fmt.Println("per = ",per) fmt.Println("per的地址是:",&per) fmt.Println("per指向的值是:",*per) } ``` **运行结果** ``` 0xc000014060 per = 0xc000014060 per的地址是: 0xc00000e030 per指向的值是: 10 ``` 获取指针类型所指向的值、使用,*,比如。var pur *int,使用*pur获取ptr指向的值 <br> <br> ## **2:案例演示** 1)写一个程序,获取一个int变量num的地址,并显示到终端 2)将num的地址赋给指针ptr,并通过ptr去修改num的值. **案例1:** ``` package main import ( "fmt" ) func main(){ var sum int = 10 fmt.Println(&sum) } ``` **运行结果** `0xc0000b4008` <br> <br> **案例2:** 将num的值赋给per,通过per的指针去修改num的值 ``` package main import ( "fmt" ) func main(){ var num int = 10 var per *int = &num *per = 20 fmt.Println("num1",num) fmt.Println("num1的内存地址是:",&num) } ``` **运行结果** ``` num1 20 num1的内存地址是: 0xc000014060 ``` <br> <br> ## **3:课堂练习** **练习1:** 如下:是否可以编译通过,如果不通过则会怎样?? ``` var num int = 10 var per *int = num fmt.Println("num1",num) ``` **答:** 不通过,会报错!因为在指针赋值的过程中,必须使用&num <br> **练习2:** ``` package main import ( "fmt" ) func main(){ var num int = 10 var per *float32 = &num fmt.Println("num",num) } ``` **运行结果** 答: 1,不能将&num3(type\*int)用作赋值中的type\*float32 2,类型不通过 <br> <br> **练习3:** 下方代码是否可以编译通过?,会输出什么? ``` package main import ( "fmt" ) func main(){ var num int = 100 var num1 int = 200 var per *int = &num *per = 300 per = &num1 *per = 400 fmt.Println(num,num1,*per) } ``` <br> <br> ## **4:指针细节** 1) 值类型,都有对应的指针类型,形式为*数据类型,比如int的对应的指针就是 *int, float32对应的指针类型就是*float32, 依次类推。 2) 值类型包括:基本数据类型int系列, float系列, bool, string、数组和结构体struct