教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 1-7 指针

1-7 指针

发布时间:2023-01-16   编辑:jiaochengji.com
教程集为您提供1-7 指针等资源,欢迎您收藏本站,我们将为您提供最新的1-7 指针资源

1-7 指针

在go语言中定义指针时,支持指针类型 *T,指针的指针 **T,以及包含包名前缀的 *.T。

指针的特性

  • 默认值 nil,没有 NULL 常量。
  • 操作符 “&” 取变量地址,"*" 透过指针访问目标对象。
  • 不支持指针运算,不支持 “->” 运算符,直接用 “.” 访问目标成员。

package main

import "fmt"

func main() {
	type data struct {
		a int
	}
	var d = data{1234}
	var p *data
	p = &d
	fmt.Printf("%p, %v\n", p, p.a) // 直接用指针访问目标对象成员,无须转换。
}

  • 使用unsafe.Pointer对指针进行类型转换
func func1() {
	x := 0x12345678
	p := unsafe.Pointer(&x) // *int -> Pointer
	n := (*[4]byte)(p)      // Pointer -> *[4]byte
	for i := 0; i < len(n); i   {
		fmt.Printf("%X ", n[i])
	}
}

Go语言在设计的时候,为了编写方便、效率高以及降低复杂度,被设计成为一门强类型的静态语言。强类型意味着一旦定义了,它的类型就不能改变了;静态意味着类型检查在运行前就做了。
同时为了安全的考虑,Go 语言是不允许两个指针类型进行转换的。
我们一般使用*T作为一个指针类型,表示一个指向类型T变量的指针。为了安全的考虑,两个不同的指针类型不能相互转换,比如*int 不能转为*float64。
而unsafe.Pointer 是一种特殊意义的指针,它可以包含任意类型的地址,有点类似于 C 语言里的void*指针,全能型的。也就意味着它某种程度上可以进行类型转换。

  • 将 Pointer 转换成 uintptr,可变相实现指针运算
func main() {    
	d := struct {        
		s   string        
		x   int    
	}{"abc", 100}
	p := uintptr(unsafe.Pointer(&d))   // *struct -> Pointer -> uintptr    
	p  = unsafe.Offsetof(d.x)          // uintptr   offset
	p2 := unsafe.Pointer(p)            // uintptr -> Pointer    
	px := (*int)(p2)                   // Pointer -> *int    
	*px = 200                          // d.x = 200
	fmt.Printf("%#v\n", d) 
} 
到此这篇关于“1-7 指针”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
超详细的C 指针介绍及实例教程
C语言中变量定义/声明深入分析
python中seek怎么用
C语言 指针数组 和 指向指针的指针
Win8.1设置鼠标双击和指针移动速度?
C语言中函数 与 指针学习笔记
简易代码描绘网页个性鼠标指针
Python中有指针吗?
jQuery中(function(){})()执行顺序的理解
go 指针

[关闭]
~ ~