十四、go语言的指针

这篇具有很好参考价值的文章主要介绍了十四、go语言的指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、指针

1.1 指针的概念

指针是存储另一个变量的内存地址的变量。

我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。

一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。

十四、go语言的指针

在上面的图中,变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,现在a被认为指向b。

1.2 获取变量的地址

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

package main

import "fmt"

func main() {
   var a int = 10   

   fmt.Printf("变量的地址: %x\n", &a  )
}

运行结果:

变量的地址: 20818a220

1.3 声明指针

声明指针,*T是指针变量的类型,它指向T类型的值。

var var_name *var-type

var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。

var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮点型 */

示例代码:

package main

import "fmt"

func main() {
   var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */

   ip = &a  /* 指针变量的存储地址 */

   fmt.Printf("a 变量的地址是: %x\n", &a  )

   /* 指针变量的存储地址 */
   fmt.Printf("ip 变量的存储地址: %x\n", ip )

   /* 使用指针访问值 */
   fmt.Printf("*ip 变量的值: %d\n", *ip )
}

运行结果:

a 变量的地址是: 20818a220
ip 变量的存储地址: 20818a220
*ip 变量的值: 20

示例代码:

package main

import "fmt"

type name int8
type first struct {
	a int
	b bool
	name
}

func main() {
	a := new(first)
	a.a = 1
	a.name = 11
	fmt.Println(a.b, a.a, a.name)
}

运行结果:

false 1 11

未初始化的变量自动赋上初始值

package main

import "fmt"

type name int8
type first struct {
	a int
	b bool
	name
}

func main() {
	var a = first{1, false, 2}
	var b *first = &a
	fmt.Println(a.b, a.a, a.name, &a, b.a, &b, (*b).a)
}

运行结果:

false 1 2 &{1 false 2} 1 0xc042068018 1

获取指针地址在指针变量前加&的方式

1.4 空指针

Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。

空指针判断:

if(ptr != nil)     /* ptr 不是空指针 */
if(ptr == nil)    /* ptr 是空指针 */

1.5 获取指针的值

获取一个指针意味着访问指针指向的变量的值。语法是:*a

示例代码:

package main  
import (  
    "fmt"
)

func main() {  
    b := 255
    a := &b
    fmt.Println("address of b is", a)
    fmt.Println("value of b is", *a)
}

1.6 操作指针改变变量的数值

示例代码:

package main

import (  
    "fmt"
)

func main() {  
    b := 255
    a := &b
    fmt.Println("address of b is", a)
    fmt.Println("value of b is", *a)
    *a++
    fmt.Println("new value of b is", b)
}

运行结果

address of b is 0x1040a124  
value of b is 255  
new value of b is 256  

1.7 使用指针传递函数的参数

示例代码

package main

import (  
    "fmt"
)

func change(val *int) {  
    *val = 55
}
func main() {  
    a := 58
    fmt.Println("value of a before function call is",a)
    b := &a
    change(b)
    fmt.Println("value of a after function call is", a)
}

运行结果

value of a before function call is 58  
value of a after function call is 55  

不要将一个指向数组的指针传递给函数。使用切片。

假设我们想对函数内的数组进行一些修改,并且对调用者可以看到函数内的数组所做的更改。一种方法是将一个指向数组的指针传递给函数。

package main

import (  
    "fmt"
)

func modify(arr *[3]int) {  
    (*arr)[0] = 90
}

func main() {  
    a := [3]int{89, 90, 91}
    modify(&a)
    fmt.Println(a)
}

运行结果

[90 90 91]

示例代码:

package main

import (  
    "fmt"
)

func modify(arr *[3]int) {  
    arr[0] = 90
}

func main() {  
    a := [3]int{89, 90, 91}
    modify(&a)
    fmt.Println(a)
}

运行结果

[90 90 91]

虽然将指针传递给一个数组作为函数的参数并对其进行修改,但这并不是实现这一目标的惯用方法。我们有切片。

示例代码:

package main

import (  
    "fmt"
)

func modify(sls []int) {  
    sls[0] = 90
}

func main() {  
    a := [3]int{89, 90, 91}
    modify(a[:])
    fmt.Println(a)
}

运行结果:

[90 90 91]

Go不支持指针算法。

package main

func main() {
b := […]int{109, 110, 111}
p := &b
p++
}

nvalid operation: p++ (non-numeric type *[3]int)

指针数组

package main

import "fmt"

const MAX int = 3

func main() {

   a := []int{10,100,200}
   var i int

   for i = 0; i < MAX; i++ {
      fmt.Printf("a[%d] = %d\n", i, a[i] )
   }
}

结果

a[0] = 10
a[1] = 100
a[2] = 200

有一种情况,我们可能需要保存数组,这样我们就需要使用到指针。

package main

import "fmt"

const MAX int = 3

func main() {
   a := []int{10,100,200}
   var i int
   var ptr [MAX]*int;

   for  i = 0; i < MAX; i++ {
      ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
   }

   for  i = 0; i < MAX; i++ {
      fmt.Printf("a[%d] = %d\n", i,*ptr[i] )
   }
}

结果

a[0] = 10
a[1] = 100
a[2] = 200

1.8 指针的指针

指针的指针

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。

var ptr **int;
package main

import "fmt"

func main() {

   var a int
   var ptr *int
   var pptr **int

   a = 3000

   /* 指针 ptr 地址 */
   ptr = &a

   /* 指向指针 ptr 地址 */
   pptr = &ptr

   /* 获取 pptr 的值 */
   fmt.Printf("变量 a = %d\n", a )
   fmt.Printf("指针变量 *ptr = %d\n", *ptr )
   fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}

结果

变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000

指针作为函数参数

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var a int = 100
   var b int= 200

   fmt.Printf("交换前 a 的值 : %d\n", a )
   fmt.Printf("交换前 b 的值 : %d\n", b )

   /* 调用函数用于交换值
   * &a 指向 a 变量的地址
   * &b 指向 b 变量的地址
   */
   swap(&a, &b);

   fmt.Printf("交换后 a 的值 : %d\n", a )
   fmt.Printf("交换后 b 的值 : %d\n", b )
}

func swap(x *int, y *int) {
   var temp int
   temp = *x    /* 保存 x 地址的值 */
   *x = *y      /* 将 y 赋值给 x */
   *y = temp    /* 将 temp 赋值给 y */
}

结果文章来源地址https://www.toymoban.com/news/detail-501176.html

交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100

到了这里,关于十四、go语言的指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言第二十四弹---指针(八)

    ✨ 个人主页:   熬夜学编程的小林 💗 系列专栏:   【C语言详解】   【数据结构详解】 指针 1、数组和指针笔试题解析  1.1、字符数组 1.1.1、代码1: 1.1.2、代码2: 1.1.3、代码3: 1.1.4、代码4: 1.1.5、代码5: 1.1.6、代码6: 总结    1.1.1、代码1: char arr[] = {\\\'a\\\',\\\'b\\\',\\\'c\\\',\\\'d\\\',\\\'e

    2024年02月20日
    浏览(76)
  • go语言(十四)----反射

    变量的结构 2 举个例子

    2024年01月23日
    浏览(36)
  • 【C语言】——认识指针变量和地址,以及指针变量类型的意义

    🎥 岁月失语唯石能言的个人主页         🔥 个人栏专: 秒懂C语言 ⭐ 若在许我少年时,一两黄金一两风      目录 前言 一、指针变量和地址 1.1 取地址操作符() 1.2 指针变量和解引用操作符(*) 1.2.1 指针变量 1.2.2 如何拆解指针类型 1.2.3 解引用操作符 1.3 指针变量

    2024年02月04日
    浏览(58)
  • 【C语言】——指针四:字符指针与函数指针变量

      在前面的学习中,我们知道有一种指针类型为 字符指针: c h a r ∗ char* c ha r ∗ 。下面我们来介绍它的使用方法。    使用方法:      如果我们想 存储字符串 ,可以用什么方法呢?之前我们一般都是用 字符数组 ,那还有什么办法呢?其实, 字符指针 也是可以

    2024年04月12日
    浏览(46)
  • C语言指针操作(二)指针变量作为函数参数

    指针变量作为函数参数详解,形参和实参之间的值传递如何传递?如何改变指针变量所指向的变量? 函数的参数不仅可以是整型,浮点型,字符型等数据,还可以是指针类型;它的作用是将一个变量的地址传送到另一个函数中。 关于地址,指针,指针变量可以参考一下这篇

    2024年02月04日
    浏览(50)
  • c语言---函数指针变量

    函数指针变量应该是用来存放函数地址的,未来通过地址能够调用函数的。 那么函数是否有地址呢? 接下来看看: 运行结果: 确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过 函数名 的方式获得函数的地址。这两个结果一模一样。 如果

    2024年02月22日
    浏览(38)
  • 【go语言基础】指针数组和数组指针

    (1)指针数组: 存储指针的数组,也叫存储地址的数组,简单说就是存储地址的。 首先它是一个数组,数组中的元素都是指针(地址)。 (2)数组指针: 首先它是一个指针,存储的是指向数组的指针。 (1)指针数组 定义: 注意:首先是一个数组,将数组中的元素定义为

    2024年02月13日
    浏览(52)
  • C语言-指针概念

    什么是指针: 地址指向变量单元,打个比方,一个房间的门口挂了一个房间号2008,这个2008就是房间的地址,或者说,2008\\\"指向\\\"该房间.因此,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元! 类型 * 指针名 所以:指针名可以代表某一个地址,通过

    2023年04月09日
    浏览(33)
  • 【C语言】const修饰普通变量和指针

    大家好,我是苏貝,本篇博客带大家了解const修饰普通变量和指针,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 用const修饰普通变量时,是在语法层面限制了变量的修改,但是本质上,变量还是变量,是一种不能被修改的变量。以下两种定义方式都可以:

    2024年02月12日
    浏览(48)
  • 【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)

    🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C++笔记专栏: C++笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 上篇回顾:上篇我们通过数组名为切入口引出数组与指针间的关系,本篇将介绍不同类型的指针变量在不同场景中的使用 对于字符和字符串,C语言

    2024年04月25日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包