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

image

插曲


// 定义方式复习
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)
}

image

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
}
posted @   我也有梦想呀  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2022-05-31 Redis存储商品热度
2022-05-31 SpringSecurity简单入门
点击右上角即可分享
微信分享提示