(八)golang--复杂类型之指针

摘要:
首先,我们要明确:基本数据类型:变量存储值,也称为值类型;获取变量的地址。使用&(如varnumint)获取num:#的地址;指针类型:变量存储一个地址,该地址指向的空间存储一个值,例如varptr*int=#获取指针类型所指向的值。使用*,如var*ptrint,并使用*ptr获取ptr指向的值;Packagemainimportfuncmain(){varnum int=1varptr*int=&numfmt.Printlnfmt.Println}ptr是一个指针,其值是num的地址。同时,它还有一个地址。

首先我们要明确:
(1)基本数据类型:变量存的就是值,也叫值类型;

(2)获取变量的地址,用&,例如var num int,获取num的地址:#

(3)指针类型:变量存的是一个地址,这个地址指向的空间存的才是值,例如var ptr *int = #

(4)获取指针类型所指向的值,使用*,例如var *ptr int,使用*ptr获取ptr指向的值;

package main

import (
    "fmt"
)

func main() {
    var num int = 1
    var ptr *int = &num
    fmt.Println("num的地址是:", &num)
    fmt.Println("ptr的值是:", ptr)
    fmt.Println("ptr的地址是:", &ptr)
}

(八)golang--复杂类型之指针第1张

ptr是一个指针,它的值是num的地址,同时,它自己也会有一个地址。我们可以通过地址定位到变量并改变变量的值:

package main

import (
    "fmt"
)

func main() {
    var num int = 1
    var ptr *int
    fmt.Println("num的值是:", num)
    ptr = &num
    *ptr = 10
    fmt.Println("num的值是:", num)
}

(八)golang--复杂类型之指针第2张

 我们还可以通过切换指针的值来改变不同变量的值:注意指针类型与变量类型之间要匹配。

package main

import (
    "fmt"
)

func main() {
    var num1 int = 1
    var num2 int = 2
    var ptr *int
    fmt.Println("num1的值是:", num1)
    fmt.Println("num2的值是:", num2)
    ptr = &num1
    *ptr = 10
    ptr = &num2
    *ptr = 20
    fmt.Println("num1的值是:", num1)
    fmt.Println("num2的值是:", num2)
}

(八)golang--复杂类型之指针第3张

 指针使用细节:
(1)值类型,都有对应的指针,形式为*数据类型,比如int对应的指针就是*int,float32对应的指针就是*float;

(2)值类型包括:基本数据类型int系列、float系列、bool、string、数组和结构体;

值类型和引用类型:

(1)值类型包括:基本数据类型int系列、float系列、bool、string、数组和结构体;

(2)引用类型:指针、slice切片、map、管道channel、interface等;

值类型和引用类型的区别:
(1)值类型,变量直接存储,内存通常在中分配;

(2)引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储的数据值,内存通常在堆上分配,当没有任何变量引用这个地址时,改地址对应的数据空间就是一个垃圾,由GC来回收;

免责声明:文章转载自《(八)golang--复杂类型之指针》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MQ中将消息发送至远程队列的配置使用unittest的discover方法发现目录中子文件夹中的case下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

打印全排列

打印出一个字符串的全排列,有很多方法,最容易看到的是递归的方法。 void range(char a[], int k){ if(k==a.length-1){ System.out.println(Arrays.toString(a)); } else { for(int i=k;i<a.length;i++){ swap(a[i],a[k]);...

kafka时间轮的原理(一)

概述早就想写关于kafka时间轮的随笔了,奈何时间不够,技术感觉理解不到位,现在把我之前学习到的进行整理一下,以便于以后并不会忘却。kafka时间轮是一个时间延时调度的工具,学习它可以掌握更加灵活先进的定时器技术,补益多多。本文由浅到深进行讲解,先讲解定时器基础以及常用定时器,接着就是主要的kafka时间轮实现。大部分都是原理。后期作者写第二部分的时候专门...

虚拟内存管理【转】

  现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持。首先引入 PA 和 VA 两个概念。 1.PA(Physical Address)---物理地址   如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出...

ABAP 用指针的方式

首先要定义指针 FIELD-SYMBOLS: <fs_out> LIKE gt_tab_out. 然后在循环赋值时使用ASSIGNING关键字对指针初始化。 LOOP AT lt_tab_out ASSIGNING <fs_out> WHERE aufnr NE space.        READ TABLE lt_afko WI...

Pointer Lock API(1/3):Pointer Lock 的总体认识

前言 指针锁定(Pointer Lock),以前也叫鼠标锁定,提供了基于鼠标随时间的移动(如deltaΔ)的输入方法,不仅仅是视窗区域鼠标的绝对位置。指针锁定让你能够访问原始的鼠标移动,将鼠标事件的目标锁定为单个元素,消除了单个方向上鼠标能够移动的最远距离限制,并且,可以把鼠标从视图中去除(隐藏效果)。 这对于Web的第一人称之类的3D游戏来说,是极为理想...

算法思想篇(1)————枚举算法

枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法一般使用while循环实现。使用枚举算法解题的基本思路如下所示。 (1)确定枚举对象、枚举范围和判定条件; (2)逐一枚举可能的解,验证每个解是否是问题的解。 枚举算法一般按照如下三个步骤进行。 (1)题解的可能范围,不能...