Golang指针

学过C语言的老司机都知道,指针就是一个变量,用于存储另一个变量的内存地址。

那么什么是变量呢?在现代计算机体系结构中所有的需要执行的信息代码都需要存储在内存中,为了管理存储在内存的数据,内存是划分为不同的区域的,不同区域都用内存地址来标识。一个典型的内存地址是个16进制的8位数(一个字节)比如0xAFFFF(这是一个内存地址的十六进制表示)。

要访问数据,我们需要知道它的存储地址。我们可以跟踪存储与我们的程序相关的数据的所有内存地址。但是要记住这些内存地址,非常费劲,怎么办呢?

于是我们引入了变量的概念。变量只是给存储数据的内存地址的好记得别名。指针也是一个变量。但它是一种特殊的变量,因为它存储的数据不仅仅是一个普通的值,如简单的整数或字符串,而是另一个变量的内存地址。

在上面的图中,指针p包含变量a的地址值0x0001。

package main

import "fmt"

func main() {

    var p *int

    fmt.Println("p = ", p)

}

# Output

p = <nil>

指针声明

T类型的指针使用以下语法声明:

//类型T的指针

var p *T

类型T是指针指向的变量的类型。比如整型指针:

//类型为整型指针

var p *int

p指针只能保存int变量的内存地址。

指针的零值,不是0,而是nil。任何未初始化的指针值都为nil。我们直接撸一个代码:

package main

import "fmt"

func main() {

var p *int

fmt.Println("chongchong p = ", p)

}

#Output

chongchong p = <nil>

初始化指针

初始化一个指针,只需给他赋予其他变量的内存地址接口。变量的地址可以使用使用&运算符获得:

var x = 100

var p *int = &x

上面我们通过对x做&运算符来获取其地址,然后将该地址分配给指针p。

就像Golang中的其他变量一样,编译器也会推断指针变量的类型。所以你可以在上面的例子中省略指针p中的类型声明,直接简写为:

var p = &x

撸代码之例2 :

package main

import "fmt"

func main() {

var a = 3.1415926

var p = &a

fmt.Println("chongchong value a = ", a)

fmt.Println("chongchong Address a = ", &a)

fmt.Println("chongchong value p = ", p)

}

输出结果

chongchong value a = 3.1415926

chongchong Address a = 0Xc82000a330

chongchong value p = 0Xc82000a330

指针解引用

要获得指针指向地址的值,我们可以使用*运算符。这叫解引用。

package main

import "fmt"

func main() {

var a = 100

var p = &a

fmt.Println("chongchong a = ", a)

fmt.Println("chongchong p = ", p)

fmt.Println("chongchong *p = ", *p)

}

输出入下:

chongchong a = 100

chongchong p = 0Xc82000a330

chongchong *p = 100

通过*运算符不仅能取值,还可以对指向变量值做修改。以下示例通过指针p设置存储在变量a中的值:

package main

import "fmt"

func main() {

    var a = 8888

    var p = &a

    fmt.Println("chongchong a = ", a)

    *p +=1112

    fmt.Println("chongchong a(altered)= ", a)

}

结果如下:

chongchong a = 8888
chongchong a(altered)= 10000

多重指针

指针可以指向任何类型的变量。所以也可以指向另一个指针。以下示例显示如何创建指向另一个指针的指针:

package main

import "fmt"

func main() {

var a = 3.141596

var p = &a

var pp = &p

fmt.Println("a = ", a)

fmt.Println("chong address a = ", &a)

fmt.Println("p = ", p)

fmt.Println("chongchong p = ", &p)

fmt.Println("pp = ", pp)

fmt.Println("chongchong *pp = ", *pp)

fmt.Println("chongchong **pp = ", **pp)

}

结果输出为

a = 3.1415926
chong address a = 0Xc82000a330
p = 0Xc82000a330
chongchong p = 0Xc820030020
pp =  0Xc820030020
chongchong *pp=0Xc82000a330
chongchong **pp =  3.1415926

Go中没有指针算术

老司机,都知道,可以在C/C ++中队指针做计算,但是golang就不支持那样做了。

package main

func main() {

var x = 67

var p = &x

var p1 = p + 1 // Compiler Error: invalid operation

}

但是,golang中可以使用==运算符来比较两个相同类型的指针是否相等。

包主要

package main

import "fmt"

func main() {

var a = 3014

var p1 = &a

var p2 = &a

if p1 == p2 {

fmt.Printf("chongchong p1(%x) = p2(%x) value(%d): \n",p1,p2,*p1)

}

}

结果为:

chongchong p1(c82000a330) = p2(c82000a330) value(3014)

原文地址:https://www.cnblogs.com/richiewlq/p/10399893.html

时间: 2024-11-09 13:23:34

Golang指针的相关文章

Golang - 指针与引用

? Golang有指针 , 那么一切数据都是值传递吗 ? 都需要用户进行指针传递吗, 其实不然, 对于Go语言, 虽然有指针, 但是其也有引用传递. 是不是很绕, 因为引用传递就是指针传递哇 . 我们继续解释. 概念 在Go语言中,对于布尔变量或数值类型或字符串类型或数组 以及struct都是按照值传递的:值在传递给函数或者方法时会被复制一份,然后方法或函数使用的是复制的这份值,也就不会对原值产生什么影响.一般情况下,对于布尔变量或数值类型或字符串类型的按值传递是非常廉价的,Go语言编译器会在传

TODO:Golang指针使用注意事项

先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. 在看例子3: 输出: map[a:aa b:bb] map[b:world a:hello] 发现什么了,TestMap前面没有加*,没有用指针,怎么也会改变值呢?因为map提供键值功能,用起来像指针引用的类型.类似这种功能的类型还有,数组切片,channel,interface.Go语言包这种指针引用类型,有兴趣可以去阅读一下源码,变量

Golang 指针

默认指针类型 类型 名称 长度 默认值 pointer 指针 nil array 数组 0 slice 切片 nil map 字典 nil struct 结构体 1. 变量和内存地址 go 语言中指针是很容易学习的,比 C 中容易的多,它可以更简单地执行一些任务 每个变量都有内存地址,可以理解为变量来操作对应的内存 go 语言的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址 package main import "fmt" func main() { var a

golang指针修改值

package main import "fmt" func main(){ x,y := 1,2 swap(&x,&y) fmt.Println(x,y) } func swap(a,b *int){ t := *a *a = *b *b = t } //修改不成功 //func swap(a,b *int){ // b,a = a,b //} 原文地址:https://www.cnblogs.com/kisslight/p/10884969.html

golang指针函数

func main() { a := models.SmsVerify{} a.Id = 100 fmt.Println(a.Id) // 100 test111(a) fmt.Println(a.Id) // 100 a222 := new(models.SmsVerify) a222.Id = 200 fmt.Println(a222.Id) // 200 test222(a222) fmt.Println(a222.Id) // 201 } func test111(sms models.

【golang】wait,why not safe

slice?俺知道,不就是基于数组的一个视窗嘛! 出个题呗~ 好~ package main func main() { var arr = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} s := arr[2:6] modify(s) } func modify(tmp []int) { // 实现该函数,把arr[8]的值修改为200 } 你千万别告诉我是这样实现的: var point = &tmp[3] point += 3 *point = 200 这样做你

go基础语法-指针

1.基础定义 golang的指针没有cpp等语言的指针复杂,具体表现在其不可用于运算.只有值传递 语法:var variableName *int = memoryAddr var a = 2 var p *int = &a p = p + 1 //编译器会报错:invalid operation : ... 2.指针类型转换 golang中不同类型的指针间不能相互转换,例:*int.*int32.*int64 m1,m2,m3 := int(1),int32(1),int64(1) p :=

Google资深工程师深度讲解Go语言☆

准备工作 ######课程导读: Go语言的历史起源??? 为什么会有Go出现?? Go的发展趋势?? 怎么样学习Go?? ######安装与环境: 视频地址:安装与环境 ######Go的参考资料汇总:1.GO语言零基础入门资料整理2.Restful接口开发(PHP)3.Go入门指南4.Learngobyexample 巩固语法基础的Demo,初学者“抄”(学习)代码的地方5.Go 初学者成长之路6.Go 标准库中文文档7.<编程之法:面试和算法心得>8.目录: 第1章 课程介绍    欢迎

Golang 中的指针 - Pointer

Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func . 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性.但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算.从这一点看,Golang 的指针基本就是一种引用