package main
import "fmt"
func main() {
var a int = 10
var p *int = &a
fmt.Println( "000>>a = ",a)
fmt.Printf( "000>>p=%v p=%v,&p=%p\n ",p,*p,p)
a = 100
fmt.Println( "001>>a = ",a)
*p = 250
fmt.Println( "002>>a= ",a)
fmt.Println("003>>*p = ", a)
}
说明:
指针:
指针就是地址。指针变量就是存储地址的变量。
*p:解引用、间接引用。
栈帧:
用来给函数运行提供内存空间。取内存于stack 上。
当函数调用时,产生栈帧。函数调用结束,释放栈顿。
栈帧存储: 1.局部变量。2.形参。(形参与局部变量存储地位等同) 3.内存字段描述值
指针使用注意:
空指针:未被初始化的指针。 var p *int *p--> err
野指针:被—片无效的地址空间初始化。
格式化输出:;
%q: 以Go语言格式显示字符串。默认带有""符
%v:显示对应数据详细信息
变量存储:
等号左边的变量,代表变量所指向的内存空间。 (写)
等号右边的变星,代表变量内存空间存储的数据值。(读)
指针的函数传参。
代码:
package main
import "fmt"
func main() {
var a int = 10
fmt.Println("&a", &a)
var p *bool
//在 heap 上申请一片内存地址空间
p = new(bool) //默认类型的默认值
fmt.Println(*p)
var p1 *int //在 heap 上申请一片内存地址空间
p1 = new(int) //默认类型的默认值
fmt.Println(*p1)
var p2 *string //在 heap 上申请一片内存地址空间
p2 = new(string) //默认类型的默认值
fmt.Printf("%s\n",*p2)
fmt.Printf("%q\n",*p2)
}
输出:
&a 0xc0000120b0
false
0
""