指针?妈呀,啥玩意?是针吗?是时钟的指针?当然都不是,百度百科这样解释: 在计算机科学中,指针(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 }