首页 > 其他分享 >GoLang:指针

GoLang:指针

时间:2023-08-22 09:33:49浏览次数:29  
标签:arr 指向 int fmt GoLang var 指针

学习自:GoLang教程110页

1、普通指针

说明

指针变量用于存放其他变量的地址

无论指向什么类型的变量,指针的实际内存占用都是一样的:32位4B,64位8B:

var p1 *int;
var p2 *float64;
var p3*bool;

fmt.Println(unsafe.Sizeof(p1))//8
fmt.Println(unsafe.Sizeof(p2))//8
fmt.Println(unsafe.Sizeof(p3))//8

使用:*p

var num int = 666
var p *int = &num

//查看地址
fmt.Printf("%p\n",&num) //0xc0000180c0
fmt.Printf("%p\n",p) //0xc0000180c0
fmt.Printf("%T\n",p) //*int

//修改指向地址的内容
*p=888
fmt.Println(num)//888
fmt.Println(*p)//888

2、指向数组的指针

1)指向数组

在Go中,如果要获取数组的地址,有两种方式:&arr与&arr[0]

arr := [3]int{1,3,5}
fmt.Printf("%p\n",&arr)
fmt.Printf("%p\n",&arr[0])

//不能直接打印数组名
fmt.Printf("%p\n",arr)//错误

Go中,只有相同数据类型才能赋值,所以要将一个指针指向数组,只能这样写:&数组名

var arr [3]int = [3]int{1,3,5}

var p *[3]int //p类型是*[3]int
p=&arr


//以下两种错误写法,只有相同类型才能赋值
p=arr //arr是[3]int类型
p=&arr[0]//&arr[0]是*int类型

说明

不支持+1 -1 ++ --

2)操作数组的几种方式

①数组名:arr[i]

②指针:(*p)[i]

③指针:p[i]

//①数组名:arr[i]
//②指针:(*p)[i]
//③指针:p[i]

var p *[3]int
var arr [3]int=[3]int{1,2,3}
p=&arr

//三种方法 arr[2] (*p)[2] p[2]

//错误方式
*(p+1)
*(p++)

  

3、指向切片的指针

1)说明

切片的本质就是一个指向数组的指针,因此指向切片的指针是一个二级指针

2)定义与操作

var sce []int = []int{1,3,5} //sce的类型是[]int
var p *[]int                      //p的类型是*[]int  
p=&sce                          //p指向切片时也是用引用&

p             //&[1,3,5]
*p            //[1,3,5]

访问其中某个值

①sce[i]

②(*p)[i]

 

4、指向字典的指针

dict :=map[string]string{"name":"lnj","age":"33"}
var p *map[string]string=&dict

//通过指针操作map元素
(*p)["name"]="zs"

5、指针作为函数参数和返回值

指针作为参数时,此时函数内外是引用传递——对形参的修改会影响实参

不能将函数内部定义的指向局部变量的指针进行返回,这样在函数结束时空间会被释放

可以将局部变量作为返回值,本质是拷贝一份。

 

标签:arr,指向,int,fmt,GoLang,var,指针
From: https://www.cnblogs.com/ShineLeBlog/p/17646521.html

相关文章

  • GoLang:map
    学习自:GoLang学习手册100页1、说明map,即字典,存储一系列的K-V对,通过Key获取响应的元素。2、定义1)定义dic:= map[K类型]V类型{K1:V1,K2:V2,K3:V3,...}vardicmap[K类型]V类型=map[K类型]V类型{K1:V1,K2:V2,K3:V3,...}dic:=map[int]int{0:1,1:3,2:5}//dic为map[0:1,1:......
  • golang.org/x/子仓库
    在Go语言的生态中,golang.org/x/是一个特殊的前缀,它表示一系列Go子仓库,这些子仓库包含了Go核心开发团队维护的实验性或辅助工具、库和包。这些仓库可能不会被包含在Go的标准库中,但它们仍然由Go的核心维护者维护,并且通常有很高的质量标准。这些golang.org/x/子仓库在......
  • golang 读取运行程序的相关目录
    获取运行程序的所在目录、工作目录import( "fmt" "os" "path/filepath")funcmain(){ fmt.Println("startm1") path,_:=os.Executable() fmt.Println("path",filepath.Dir(path)) dir,_:=filepath.Abs(filepath.Di......
  • VScode调试时查看指针所指向的值
    如图,现有一个字符串filenames[10000]传入到了其它函数,在该函数内设置断点进行调试时该字符串仅显示了个地址(虽然后面跟着有值,但字符串过长难以观察),那么如何将其显示出来呢?解决方法: 在watch窗口添加表达式:(char(*)[想查看的位数])变量名,即(char(*)[10000])filenames 值正......
  • C++ 函数指针与Lambda匿名函数
    函数指针c语言学过了,这里简单记一下,下面举例一个用法就行:#include<iostream>#include<vector>template<classT>voidprint(Tv){ std::cout<<v<<std::endl;}template<classT1,classFunc>voidForEach(std::vector<T1>&v,Func......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 智能指针
    智能指针使用智能指针需要引入memory头文件unique_ptr#include<iostream>#include<string>#include<memory>classEntity{public: Entity(){ std::cout<<"CreatedEntity!"<<std::endl; } ~Entity(){ std::cout<<&q......
  • Java为什么不让用指针?
    指针是C和C++等语言中的一个强大工具,它们允许开发者直接访问内存地址,从而为高性能的系统级编程提供了可能性。然而,Java在设计时刻意避免了指针的使用。为什么?2.Java的设计哲学简单性和可读性:Java的设计目标之一是使语言更加简单和容易理解,从而降低错误的可能性。指针经常被认为是......
  • 【python】如何将枚举指针传递至dll接口中
    在Python中,可以使用 ctypes 模块来将枚举指针传递给DLL接口。以下是一个简单的示例代码,演示了如何在Python中使用 ctypes 将枚举指针传递给DLL接口:importctypes#定义枚举类型classMyEnum(ctypes.Structure):_fields_=[("value",ctypes.c_int)]#加载D......
  • Gym103687D The Profiteer:回滚莫队信息双指针可以做到线性对数
    标题写得好所谓的回滚莫队信息意思是,设信息保存在两个大小分别为\(a,b\)的结构上,将这两个信息进行合并得到大小为\(a+b\)的信息需要的时间为\(\Omega(\min\{a,b\}\cdotf(n))\);而给定一个大小为\(1\)的信息,可以在\(\mathrmO(f(n))\)时间内将它加入到任何一个结构中......