指针

作者: isuntong | 来源:发表于2020-03-10 12:17 被阅读0次

指针

package main

import "fmt"

//29
func main() {
    /*
    指针pointer
        存储了另一个变量的内存地址的变量
    */
    //定义一个int类型变量
    a := 10
    fmt.Printf("a的地址是:%p\n",&a) //a的地址是:0xc00000a0c8

    //2. 创建一个指针变量,用于存储变量a的地址
    var p1 *int
    fmt.Println(p1) //<nil>
    p1 = &a //p1指向a的内存地址
    fmt.Println("p1的数值:",p1) //p1的数值: 0xc00000a0c8
    fmt.Printf("p1自己的地址:%p\n",&p1) //p1自己的地址:0xc000006030
    fmt.Println("p1的数值,是a的地址,该地址存储的数据为:", *p1) //10

    //操作变量,更改数值
    a = 100
    fmt.Println(a) //100
    fmt.Printf("%p\n",&a) //0xc00000a0c8

    //4. 通过指针,改变变量的数值
    *p1 = 200
    fmt.Println(a) //200

    //5. 指针的指针
    var p2 **int
    fmt.Println(p2) //<nil>
    p2 = &p1
    fmt.Printf("%T,%T,%T",a,p1,p2) //int,*int,**int
    fmt.Println("p2的数值:",p2) //0xc000006030
    fmt.Println("p2的地址:",&p2) //0xc000006038
    fmt.Println("a的值:",**p2) //200
    fmt.Println("p1的数值:",*p2) //0xc00000a0c8
    fmt.Printf("a的地址:%p\n",&a) //0xc00000a0c8 二者相同

}

数组指针和指针数组

package main

import "fmt"

//30
func main() {
    /*
    数组指针和指针数组
    数组指针
        *[4]Type

    指针数组
        [4]*Type
    */
    //1. 创建数组
    arr1 := [4]int{1,2,3,4}
    fmt.Println(arr1) //[1 2 3 4]

    //2. 创建一个指针,存储该数组的地址:数组指针
    var p1 *[4]int
    p1 = &arr1
    fmt.Println(p1) //&[1 2 3 4]
    fmt.Printf("%p\n",p1) //0xc000110020
    fmt.Printf("%p\n",&p1) //0xc000104020

    //3. 根据数组指针,操作数组
    (*p1)[0] = 100
    fmt.Println(arr1) //[100 2 3 4]

    //简化写法
    p1[0] = 200
    fmt.Println(arr1) //[200 2 3 4]

    //指针数组
    a := 1
    b := 2
    c := 3
    d := 4
    arr2 := [4]int{a,b,c,d}
    arr3 := [4]*int{&a,&b,&c,&d}
    fmt.Println(arr2) //[1 2 3 4]
    fmt.Println(arr3) //[0xc00000a120 0xc00000a128 0xc00000a130 0xc00000a138]

    arr2[0] = 100
    fmt.Println(arr2) //[100 2 3 4]
    fmt.Println(a) //1  变量a并未改变

    *arr3[0] = 200
    fmt.Println(arr3) //[0xc00000a120 0xc00000a128 0xc00000a130 0xc00000a138]
    fmt.Println(a) //200

    b = 1000
    fmt.Println(arr2) //值无改变,值传递 [100 2 3 4]
    fmt.Println(arr3) //地址无改变 [0xc00000a120 0xc00000a128 0xc00000a130 0xc00000a138]

}

函数指针和指针函数

package main

import "fmt"

//31
func main() {
    /*
    函数指针和指针函数

    函数指针:一个指针,指向了一个函数的指针
        因为go语言中,function默认看作一个指针,没有*

        slice,map,function

    指针函数:一个函数。该函数的返回值是一个指针

    */

    //函数指针
    var a func()
    a = funa
    a() //funa()...

    //指针函数
    arr1 := funb()
    //arr1的类型:[4]int,地址:0xc000012380,数值:[1 2 3 4]
    fmt.Printf("arr1的类型:%T,地址:%p,数值:%v\n",arr1,&arr1,arr1)

    arr2 := fund()
    //arr2的类型:*[4]int,地址:0xc000006030,数值:&[1 2 3 4]
    fmt.Printf("arr2的类型:%T,地址:%p,数值:%v\n",arr2,&arr2,arr2)
    fmt.Printf("arr2指针中存储的数组的地址:%p\n",arr2)//arr2指针中存储的数组的地址:0xc000012400

}

func fund()*[4]int {
    arr := [4]int{1,2,3,4}
    fmt.Printf("函数中arr的地址:%p\n",&arr) //函数中arr的地址:0xc000012400
    return &arr
}

func funb()[4]int {
    arr := [4]int{1,2,3,4}
    return arr
}

func funa() {
    fmt.Println("funa()...")
}

指针作为参数

package main

import "fmt"

//32
func main() {
    /*
    指针作为参数

    参数的传递:
        值传递、引用传递
    */
    a := 10
    fmt.Println("fun111()函数调用前a:",a) //fun111()函数调用前a: 10
    fun111(a)
    fmt.Println("fun111()函数调用后a:",a) //fun111()函数调用后a: 10

    fun222(&a)
    fmt.Println("fun2()函数调用后a:",a) //fun2()函数调用后a: 200


}

func fun222(p1 *int) {
    fmt.Println("fun222()函数中p1:",*p1) //fun222()函数中p1: 10
    *p1 = 200
    fmt.Println("fun222()函数中,修改后p1:",*p1) //fun222()函数中,修改后p1: 200
}

func fun111(num int) {
    fmt.Println("fun111()函数中的num值:",num) //fun111()函数中的num值: 10
    num = 100
    fmt.Println("fun111()函数中修改后的num值:",num) //fun111()函数中修改后的num值: 100
}

指针多用于处理值传递,减少值复制耗费的内存

相关文章

  • 混淆知识点

    1、指针数组&数组指针、常量指针&指针常量、函数指针&指针函数 数组指针&指针数组 数组指针的定义 int (*p...

  • C语言

    C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、C 数组

  • 指针

    普通指针指针的指针 数组指针 函数指针

  • 函数指针

    概念: 指针函数, 函数指针, 指针数组, 数组指针, 指向数组的指针, 指向函数指针数组的指针。

  • C:函数指针的坑

    关于该死的函数指针和指针函数 先来个目录 常量指针、指针常量 数组指针、指针数组 函数指针、指针函数 1、先看第一...

  • C 语言指针

    指针类型:指针的读取长度,指针的读取方向(大小端) 空指针,无类型指针,野指针 常量指针,指向常量的指针 http...

  • 二、C语言基础

    A、指针 指针的概念:指针变量 和 指针 的区别 ?答:指针变量是指针的标记,也可以通过指针变量的标记操作指针内存...

  • 王道程序员求职宝典(十一)指针与引用,树

    指针与引用 指针声明typedef别名类型检查void*指针指向指针的指针函数指针typedef简化函数指针定义初...

  • NDK02

    指针 指针概念 1 .指针变量和指针的区别?答: 指针变量是定义指针的标记,指针就是指向的内存地址。2 .函数指针...

  • 12 C指针

    1、指针定义 2、指针进阶 3、指针使用 4、多级指针 4、指针和数组 5、指针和字符串 6、高级指针之和指向函数的指针

网友评论

      本文标题:指针

      本文链接:https://www.haomeiwen.com/subject/fzoidhtx.html