1,go语言中的指针不能进行偏移和运算
2,一个指针变量,可以指向任何一个值的内存地址,它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。
3,当一个指针被定义后没有分配到任何变量时,它的值为 nil。一个指针变量通常缩写为 ptr。
4,在go语言中,&:取地址,*:根据地址取值。
5,每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。
*int*int64*string等。
指针用法
指针用法,伪代码
ptr := &v // v的类型为T
其中 v 代表被取地址的变量,被取地址的 v 使用 ptr 变量进行接收,
*T*
示例:
package main
import "fmt"
func main() {
var a int = 100
var str string = "golang"
fmt.Printf("&a = %p\n&str = %p", &a, &str)
// &a = 0xc000074008
// &str = 0xc00006c1c0
}
%p0x
注意:变量、指针和地址三者的关系是:每个变量都拥有地址,指针的值就是地址。
从指针获取指针指向的值
&*
&*&*
package main
import (
"fmt"
)
func main() {
// 准备一个字符串类型
var house = "Malibu Point 10880, 90265"
// 对字符串取地址, ptr类型为*string
ptr := &house
// 打印ptr的类型
fmt.Printf("ptr type: %T\n", ptr) // ptr type: *string
// 打印ptr的指针地址,每次运行会出现不同的结果
fmt.Printf("address: %p\n", ptr) // address: 0xc00000e1e0
// 对指针进行取值操作
value := *ptr
// 取值后的类型
fmt.Printf("value type: %T\n", value) // value type: string
// 指针取值后就是指向变量的值
fmt.Printf("value: %s\n", value) // value: Malibu Point 10880, 90265
}
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
- 指针变量的值是指针地址。
- 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。
指针修改值
指针不仅可以取值,也可以修改值。
package main
import "fmt"
// 交换函数
func swap(a, b *int) {
// 取a指针的值, 赋给临时变量t
t := *a
// 取b指针的值, 赋给a指针指向的变量
*a = *b
// 将a指针的值赋给b指针指向的变量
*b = t
}
func main() {
// 准备两个变量, 赋值1和2
x, y := 1, 2
// 交换变量值
swap(&x, &y)
// 输出变量值
fmt.Println(x, y) // 2 1
}
**