一个指针变量指向了一个值的内存地址,用它得到的内容和取地址符得到的内容相同。
指针使用:
1.定义指针变量。
2.为指针变量赋值。
3.访问指针变量中指向地址的值。
在指针类型前面加上 * 号来获取指针所指向的内容。
package main
import "fmt"
func main(){
var quanju =10
fmt.Println("quanju Address:",&quanju)
var p *int
p=&quanju
fmt.Println(*p)
fmt.Println(p)
}
运行结果为:
quanju Address: 0xc000012088
10
0xc000012088
如果只定义了指针并没有赋值,则它为空指针,它的值为nil
package main
import "fmt"
func main(){
var p *int
fmt.Println(p)
}
//
空指针并没有指向内存地址,因此*p也无法获得值
指向数组的指针
如果需要保存数组元素,则需要用到指针数组,即数组中的每个元素都是一个指针变量,指向一个值的内存地址
声明:
var pname [size] *xtype
package main
import "fmt"
func main(){
var p [5] *int
var i int
for i=0;i<5;i++{
p[i]=&i
}
for i=0;i<5;i++{
fmt.Println(*p[i])
}
}
运行结果为:
0
1
2
3
4
指向指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量
当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址
var pname ** xtype
package main
import "fmt"
func main(){
var x =10
var p1 *int
var p2 **int
p1=&x
p2=&p1
fmt.Println("x=",x)
fmt.Println("x=",*p1)
fmt.Println("x=",**p2)
fmt.Println("address of x=",&x)
fmt.Println("address of x=",p1)
//fmt.Println("address of x=",&&p2)
}
运行结果为:
x= 10
x= 10
x= 10
address of x= 0xc0000ac058
address of x= 0xc0000ac058
上面注释的语句,两次取地址会报错:
syntax error: unexpected &&, expecting expression
指针作为函数参数
在函数定义的参数上设置为指针类型,调用函数时用取地址符调用
package main
import "fmt"
func main(){
var x,y =10,20
fmt.Printf("x=%d,y=%d\n",x,y)
swap(&x,&y)
fmt.Printf("x=%d,y=%d\n",x,y)
}
func swap(x *int,y *int){
*x,*y=*y,*x
}
运行结果为:
x=10,y=20
x=20,y=10