【go语言入门笔记】12、指针

指针是一个代表着某个内存地址的值

说到指针,会让许多人“谈虎色变”,尤其对指针偏移、运算、转换都非常恐惧。
其实,指针是使C/C++语言有极高性能的根本,在操作大块数据和做偏移时方便又便捷。
C/C++中指针饱受诟病的根本原因是指针运算和内存释放。
C/C++语言中的裸指针可以自由偏移,甚至可以在某些情况下偏移进入操作系统核心区域。
我们的计算机操作系统经常需要更新、修复漏洞的本质,是为解决指针越界访问所导致的“缓冲区溢出”。

指针概念在Go语言中被拆分为两个核心概念:

  • 类型指针:允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移运算
  • 切片,由指向起始元素的原始指针、元素数量和容量组成。

受益于这样的约束和拆分,Go语言的指针类型变量拥有指针的高效访问,但又不会发生指针偏移,从而避免非法修改关键性数据问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。

1 、认识指针地址、指针类型

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。

Go语言中使用&操作符放在变量前面对变量进行“取地址”操作。

格式如下:p := &变量

例:

package main

import (
	"fmt"
)

func main() {
	a := "hello"
	p := &a //用符号 & 取变量a的地址
	fmt.Println(p)

}

运行结果:
在这里插入图片描述

  • 输出了变量a的内存地址
  • 输出值在每次运行是不同的
  • 在32位平台上,将是32位地址;64位平台上是64位地址。

2、 从指针获取指针指向的值

在对普通变量使用&操作符取地址获得这个变量的指针后
可以对指针使用*操作,也就是指针取值

例:

package main

import (
	"fmt"
)

func main() {
	a := "hello"
	p := &a
	fmt.Println(p)  //输出a的地址,p指针变量
	fmt.Println(*p)  //输出a的地址存储的值
}

运行结果:
在这里插入图片描述

3、使用指针修改值

在这里插入图片描述

package main

import (
	"fmt"
)

func main() {
	a := "hello"  //变量a
	p := &a       //p指向a变量地址
	b := "hello world" //变量b
	*p = b            //修改指针p指向的内存内容变
	fmt.Println(a)   //输出a的地址存储的值
}

运行结果:
在这里插入图片描述

4、new()函数创建指针

语法:指针变量 := new(数据类型)

package main

import (
	"fmt"
)

func main() {
	c := new(string)
	*c = "hello world" 
	fmt.Println(*c) 
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

藏蓝色攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值