这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记。
一、指针基本使用
num := 1
&a //指针地址
声明指针:*T是指针变量的类型,它指向T类型的值。
func Test_14_01(t *testing.T) {
var a int = 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
//*ip = a //这种赋值方式是错误的!!!,因为ip是指针,我们只能使用*ip来访问值,而不是来进行赋值
fmt.Printf("a 变量的地址是: %x\n", &a )
/* 指针变量的存储地址 */
fmt.Printf("ip 变量的存储地址: %x\n", ip )
/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip )
}
注意:禁止出现下面这种形式,会报错
var a *int
//下面这种情况是错误的,当指针为空时不能够直接上来对其进行赋值
*a = 15
//正确做法,只有在指针指向地址了之后才能够对值进行操作
b:=15
a = &b
*a++
*a = 22
二、空指针判断
if(ptr != nil) /* ptr 不是空指针 */
if(ptr == nil) /* ptr 是空指针 */
三、数组引用传递案例(指针函数、切片传递)
/**
三、函数数组修改。①数组指针。②
*/
//方式一:采用指针
func test3(arr *[3]int) {
(*arr)[0] = 3
}
//方式二:切片。注意:这里不要指定int[]的个数
func test3_02(slice []int) {
slice[0] = 4
}
func Test_14_03(t *testing.T) {
nums := [3]int{1,2,3}
//执行方案一
test3(&nums)
fmt.Println(nums) //[3 2 3]
//执行方案二
test3_02(nums[:])
fmt.Println(nums) //[4 2 3]
}
四、指针数组
/**
四、指针数组
*/
const MAX = 3
func Test_14_04(t *testing.T) {
a := []int{10,100,200}
var i int
var ptr [MAX]*int;
for i = 0; i < MAX; i++ {
ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
}
for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i,*ptr[i] ) //使用*数组[下标]来访问指针数组中的值
}
}
五、指针的指针
/**
五、指针的指针 **
*/
func Test_14_05(t *testing.T) {
var a int = 3000
var aa *int
var aaa **int
aa = &a
//给**指针,赋值*指针的地址
aaa = &aa
//一级指针:也就是a的地址
fmt.Println(aa) //0xc00000a358
//*aaa:相当于表示aa
fmt.Println(*aaa) //0xc00000a358
//**aaa:表示a
fmt.Println(**aaa) //3000
}
案例:使用指针函数来交换两数
/**
六、使用指针函数来交换两数
*/
func swap(a *int, b *int) {
var temp = *a
*a = *b
*b = temp
}
func Test_14_06(t *testing.T) {
a := 10
b := 15
swap(&a, &b)
fmt.Println(a) //15
fmt.Println(b) //10
}