22、指针
1.指针的概念
指针是存储另一个变量的内存地址的变量
2.获取指针的值
通过&变量名
func main() {
a := 10
fmt.Printf("%T\n", a)
fmt.Println(a)
fmt.Printf("a的内存地址:%p\n", &a)
}
3.声明指针
*T:代表着指向T类型的值
// 声明一个指针,*T:代表着指向T类型的值
var p1 *int
fmt.Println(p1) // <nil>
4.空指针
var p1 *int
fmt.Println(p1) // <nil>
5.获取指针的值
通过*指针名
// 声明一个指针,*T:代表着指向T类型的值
var p1 *int
fmt.Println(p1) // <nil>
b := 20
// 把p1指针类型变量指向b的内存地址
p1 = &b
fmt.Printf("p1的类型为:%p\n", p1)
fmt.Println(p1)
fmt.Printf("p1自己的内存地址:%p\n", &p1)
fmt.Println("p1指针对应的值:", *p1) // 就是b的值
6.操作指针改变变量的数值
// 操作变量改变其值
b = 100
fmt.Println(b)
fmt.Printf("%p\n", &b)
7.使用指针传递函数的参数
// 通过指针改变变量的值
*p1 = 200
fmt.Println(b)
8.指针的指针
// 指针的指针
var p2 **int
p2 = &p1
fmt.Println(p2)
fmt.Println(&p2)
fmt.Printf("p2的内存地址:%p\n", p2)
fmt.Println("p2指针的指针对应的值:", **p2)
var p2 *string
var s1 = "张三"
p2 = &s1
fmt.Println(p2)
fmt.Println(*p2)
var p3 **string
p3 = &p2
fmt.Println(p3)
fmt.Println(**p3)
fmt.Println(&*p3)
fmt.Printf("%T \n", p3)
**p3 = "hello"
fmt.Println(s1) // hello
插曲
// 定义方式复习
var v1 bool // 变量
const num = 20
arr1 := [5]int{} // 数组
sl1 := []int{} // 切片
map1 := map[int]string{} // map
sl2 := make([]int, 10, 2)
map2 := make(map[int]float32, 8)
len1 := len(sl2)
cap1 := cap(sl2)
len2 := len(map2)
var p3 *string // string类型指针
var p4 *float32 // float类型指针
9.指针数组和数组指针
/**
* @author ly (个人博客:https://www.cnblogs.com/qbbit)
* @date 2023/5/30 23:11
* @tags 喜欢就去努力的争取
*/
package main
import "fmt"
func main() {
// 普通数组
arr1 := [4]int{1, 2, 3, 4}
// s1 := []int{}
fmt.Printf("%T,%p\n", arr1, &arr1)
// 指针数组:首先是一个数组,里面存储的元素时指针类型
var arr2 *[4]int
arr2 = &arr1
fmt.Println(arr2)
fmt.Printf("%p\n", arr2)
fmt.Printf("%p\n", &arr2)
// 根据数组指针,操作数组
(*arr2)[0] = 100
fmt.Println(arr2)
// 简便写法
arr2[2] = 10
fmt.Println(arr2)
// 数组指针:首先是一个指针,一个数组的地址
arr3 := [4]*int{}
fmt.Printf("%T,%p\n", arr3, arr3)
}
10.指针函数和函数指针
package main
import "fmt"
func main() {
var a func()
a = fun1
a()
b := fun2()
fmt.Println(b)
c := 10
fmt.Println(c)
fun3(c)
fmt.Println(c)
fmt.Println("========================")
d := 20
fmt.Println(d)
fun4(&d)
fmt.Println(d)
fmt.Println("=========================")
arr1 := [2]int{1, 2}
fmt.Println(arr1)
fun5(arr1)
fmt.Println(arr1)
fmt.Println("=========================")
arr2 := [2]int{3, 4}
fmt.Println(arr2)
fun6(&arr2)
fmt.Println(arr2)
}
func fun1() {
fmt.Println("fun1...")
}
func fun2() [3]int {
arr := [3]int{1, 2, 3}
return arr
}
分类:
Go
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2022-05-31 Redis存储商品热度
2022-05-31 SpringSecurity简单入门