golang语言学习第六课:指针

指针?妈呀,啥玩意?是针吗?是时钟的指针?当然都不是,百度百科这样解释: 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。

指针,其实翻译的过来后,一看有点吓唬人,指针的英文是:pointer 字面上翻译过来是指向者的意思。

一个指针变量指向了一个值的内存地址。

 定义指针的方法:

var 指针变量名 *指针变量类型

实际例子:
var p *int  //指向整型,  *号用于指定变量是作为一个指针

var fp *float32    //fp为浮点型指针
 

 看看代码的实际例子吧:

package main

import "fmt"

func main() {
    var a int =2
    var p *int =&a
    *p =3
    fmt.Println(p, *p, a)   

//p为指针变量,代表寄存器的地址,*p为指针指向位置的内容,通过赋值操作,改变了指针位置指向的内容数据,其实也就是改变了变量a的值。因为指针是指向a的寄存器地址的。 }

需要注意的是:golang的指针不像C语言,它是不支持指针运算的,这样的话,学习指针就非常简单了。

学习指针,首先要搞懂函数参数的传递是值传递还是引用传递

首先我们来看一段C++的代码:

void pass_by_value (int a) {
    a++;
}

void pass_by_ref (int& a) {
    a++;
}

int main() {
    int a =3;
  
    pass_by_value(a);
    printf("After pass_by_value: %d\n", a);

    pass_by_ref(a):
    printf("After pass_by_ref: %d\n", a");

运行结果是:3, 4  (解析:这是C++的代码,第一个函数参数是值传递,第二个函数参数是引用传递)

值传递,它做了一份拷贝,  拷贝完之后,main函数里的值是不会变的。

引用传递,它不做拷贝,但是main函数里的值,它调的函数会被它改变调。

C++编程语言是这样的,那其他语言呢?其他语言,一般来说,所有调用的参数都是引用传递,除了系统内建的参数以外。比如说 java, python都是引用传递。

那么问题来了, go语言用的是值传递还是引用传递? go语言只有一种值传递一种方式,没有引用传递,但可以用指针。 

 具体看看我的练习代码吧:

package main

import "fmt"
func pass_by_point(a *int) {
    *a =999
    fmt.Println("*a的值是:",*a)
    fmt.Println("----------------")
}

func pass_by_value(a int) {
    a = 888
    fmt.Println("函数体pass_by_vaule内的a结果是:",a)
    fmt.Println("++++++++++++++++++")
}

func main() {
    var value int =777
    var a int =2
    var p *int =&a
    *p =3
    fmt.Printf("p指针是:%x\n  *p内容是:%d\n  a的值是:%d\n _____________\n",p, *p, a)
    pa :=&value
    pass_by_point(pa)
    pass_by_value(value)
    fmt.Println("main函数里的value值是:",value)
    var swap_a int =3
    var swap_b int =4
    swap(swap_a, swap_b)
    fmt.Println(swap_a, swap_b)
    swap_point(&swap_a, &swap_b)
    fmt.Println(swap_a, swap_b)
    swap_best(swap_a, swap_b)
    fmt.Println(swap_a, swap_b)
}


func swap (a,b int) {
    b, a = a, b
}

func swap_point (a,b *int) {
    *b, *a = *a, *b
}

func swap_best (a,b int) (int,int) {
    return b,a
}

猜你喜欢

转载自www.cnblogs.com/golangxiong/p/10261234.html
今日推荐