一、指针概述
一个指针变量(指针)存储的是另一个变量的内存地址。它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr。
认识指针地址和指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址(取地址操作),格式如下:
package mainimport "fmt"func main() {var count int = 5ptr := &countfmt.Printf("count的值=%d,内存地址是=%v\n",count,&count)fmt.Printf("ptr的值=%v,,ptr的类型=%T,内存地址是=%v\n",ptr,ptr,&ptr)}
其中 count 代表被取地址的变量,变量 count的地址使用指针变量 ptr 进行接收,ptr 的类型为*T, T 代表类型,*代表指针。
count的值=5,内存地址是=0xc00000a0a0ptr的值=0xc00000a0a0,,ptr的类型=*int,内存地址是=0xc000006028
提示:变量、指针和地址三者的关系是,每个变量和指针变量都拥有一个地址,变量的值是具体数据,但是指针的值是另一个变量的地址
**

指针作用
节省内存空间,提升程序效率
间接访问和修改变量的值
二、指针操作
三、指针应用场景
指针定义
package mainimport "fmt"func main() {var a int =2var b string ="pointer"var ptr1 *int=&a //声明指针变量ptr并初始化赋值&aptr2 :=&b //ptr2存储的是b的地址,是指向*string的指针fmt.Printf("ptr1的数据类型:%T\n",ptr1) //打印ptr1的类型 *intfmt.Printf("ptr1的指针地址:%p\n",ptr1)//打印ptr2的指针地址fmt.Printf("ptr2的数据类型:%T\n",ptr2) //打印ptr2的类型 *stringfmt.Printf("ptr2的指针地址:%p\n",ptr2)//打印ptr2的指针地址//对指针进行取值运算操作value:=*ptr1+3fmt.Printf("value的数据类型:%T\n",value)//取值运算后value的数据类型fmt.Printf("value的值:%d\n",value)//取值运算后value的值}//输出结果ptr的数据类型:*intptr的指针地址:0xc0000a2058value的数据类型:intvalue的值:5
取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
值传递和引用传递
除c和c++支持值传递和引用传递,其他编程语言如Java和python一般都支持引用传递。
void pass_by_val(int a) {//拷贝main函数的aa++;}void pass_by_ref(int &a) {//引用传递a++;}int main() {int a=3;pass_by_val(a);printf("After pass_by_val: %d\n", a);pass_by_ref(a);printf("After pass_by_ref: %d\n", a);}/*输出结果*/After pass_by_val:3After pass_by_ref:4
- pass_by_val函数值传递 :值传递是拷贝一份,不影响main函数的a
- pass_by_ref函数引用传递 引用传递是不拷贝,被调的参数会被改变
值传递

引用传递

&a的地址被传递给了func函数里的指针变量pa。&a和pa同时指向变量a,因此在func函数里修改指针变量pa,都会影响外面变量a的值
cache传递

cache拷贝一份被传递给了func函数里的cache。cache和func f里的cache同时指向data
**
使用指针修改值
package mainimport "fmt"func swap(x,y *int){/*交换函数*//*@:交换*x和*y的值**/*x,*y = *y,*x}func main() {x,y := 3,4swap(&x,&y)fmt.Println(x,y)}/*输出结果3,4*/
new() 函数创建指针
Go语言还提供了另外一种方法来创建指针变量,格式如下:
new(数据类型)
一般这样写:
package mainimport "fmt"func main() {str :=new(string) //new函数创建指向string类型的指针*str="Go语言指针" //指针取值fmt.Printf("str指针变量的地址:%p\n",str)fmt.Printf("str指针变量的地址:%s\n",*str)}
new() 函数可以创建一个对应类型的指针,创建过程会分配内存,被创建的指针指向默认值。
