go语言-数组指针

2023-11-04

1.数组指针
    (1)数组指针与指针数组
        这俩概念原本在c语言中就是一个绕口令般的存在,尽管从类型角度来看两者并没什么相似的地方。
        但是在go语言中对这两个类型的设定做出了一些不同的规定。首先交代一下基本概念:
            数组指针:指的是一个指针,只不过这个指针指向了一个数组
                eg:
                    var arr [5]int = [5]int{1,2,3,4,5};
                    var p *[5]int = &arr;
                    fmt.Println(p);//0xc00006a030
                    //此时p称为是数组arr的指针
                    //此时如果通过p访问数组元素是 (*p)[2],结果是3
            指针数组:指的是一个数组,这个数组里面装满了指针。
                eg:
                    var arr1 [5]int = [5]int{1,2,3,4,5};
                    var arr2 [5]int = [5]int{6,7,8,9,0};
                    var p1 *[5]int = &arr1;
                    var p2 *[5]int = &arr2;
                    var pArr [2]*[5]int = [2]*[5]int{p1,p2};
                    fmt.Println(pArr);//[0xc00006a030, 0xc00006a060]
                    //此时pArr称为是指针数组
                    //此时如果通过pArr访问数组元素是 (*pArr[0])[2],结果是3
    (2)地址相同、类型不同问题
        在go语言中,内存地址相同并不意味着其表示的数据或者数据类型就完全相同。
        eg:
            var arr [5]int = [5]int{1,2,3,4,5};
            p1,p2 := &arr,&arr[0];
            fmt.Println(p1);        //&[1,2,3,4,5] 整个数组的内存地址
            fmt.Println(p2);        //0xc0000180c0 数组第一个元素的内存地址
            fmt.Printf("%T",p1);    //*[5]int    数组指针
            fmt.Printf("%T",p2);    //*int        指针
    (3)*号可以不写问题
        在go语言中通过指针去访问指针所对应的地址处的值时,*允许不写。
        而这个规定又会催生一个由于go运算符优先级问题而催生的指针访问问题。
        eg:
            var arr [5]int = [5]int{1,2,3,4,5};
            p := &arr;
            fmt.Println(*p[0]);
        乍一看这段代码并无任何问题。
            因为p是数组指针,*p就是数组本身,而*p[0]自然就是数组的第一个元素
        但是事与愿违,代码的运行结果是一个错误!
            这是因为在go语言中*寻址运算符和[]中括号运算符的优先级是不同的!
                []中括号是初等运算符
                *寻址运算符是单目运算符
            初等运算符的优先级是大于单目运算符的,因此先参与计算的是p[0];
                p[0]其实就是数组的第一个元素,就是数字1
            数字1必然是int类型,而不是一个地址,因此针对数字1使用*寻址运算符自然也就发生了错误。
        解决问题的办法很简单,就是添加一个小括号就可以了。
            即:
                (*p)[0]
        不过因为*在go语言中,建立了 p:=&arr 这种类似地址关系后,*允许不写。
        所以,访问时候可以直接携程p[0]。事实上在工作开发过程中,这种写法反而更加常见。
        ps:
            仅对访问下标时,*寻址运算符允许不写!
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go语言-数组指针 的相关文章

  • MySQL数据库连接超时自动断开的解决方案

    一次朋友小聚 大家谈起了技术问题 一个在国企里的同学说 他们的系统很奇怪 每天早上都得重启一下应用程序 否则就提示连接数据库失败 他们都不知道该怎么办 我当时稍加思索说了一下 应该是连接超时引起的 这样的问题在我的业务场景没有遇到过 所以我

随机推荐

  • 三菱服务器显示代码d2,三菱QD64D2手册QD64D2用户手册 - 广州凌控

    SRAM E2PROM存储卡 RAM容量 64KB E2PROM容量 64KB 输入输出点数 4096点 输入输出元件数 8192点 程序容量 1000 k步QD64D2用户手册 处理速度 0 0095 s 程序存储器容量 4000 KB
  • Java--SpringMVC之处理器方法返回值

    一 处理器方法返回值 使用 Controller注解的处理器方法 返回值会有四种类型 ModelAndView String Void 自定义Java对象 1 ModelAndView ModelAndView 有数据和视图 若处理器方法处
  • python如何安装第三方库 request_python 安装第三方库 request时报错

    今天安装request时报错 F pythonFile gt pip install requests Collecting requests Downloading requests 2 24 0 py2 py3 none any whl
  • 饼图 echarts -无数据时给提示

    div class thirdEchartBody div mport pieGenderChartConfig from js passengerFlowAnalysisConfig js mounted this getGenderCh
  • 永别了gitee图床,阿里云图床我来啦!!!

    文章目录 缘由 前期准备工作一 下载了 Typora 和Picgo 1 本人 Typora 版本 2 本人Picgo 版本 准备工作二 注册阿里云账号 重要 一定要看一下 步骤一 点击控制台 步骤二 选择 对象储存 并开通 步骤三 点击左侧
  • javascript 大文件下载,分片下载,断点续传

    javascript 大文件下载 分片下载 断点续传 文章目录 javascript 大文件下载 分片下载 断点续传 1 获取文件大小 2 切片下载 3 合并数据 4 下载到本地 5 成功 6 完整代码 既然是断点续传 自然离不开分片下载
  • 小程序自动更换标题文字及icon的方法

    一 动态生成底部tabBar的icon和文字 wx setTabBarItem index 2 text 商品 iconPath assets StoreLife 2x png selectedIconPath assets storeLi
  • 关于Mysql的驱动(org.gjt.mm.mysql.Driver)问题

    目前我知道的连接mysql的驱动有两个 一个是org gjt mm mysql Driver 另外一个是com mysql jdbc Driver 我做毕设时使用的org gjt mm mysql Driver 这个比较老了 现在使用的比较
  • QT VS与QT的项目配置

    VS中添加Qt模块 VS中添加Qt文件
  • 单端、差分、伪差分输入

    单端信号 单端信号 single end 是相对于差分信号而言的 单端输入指信号有一个参考端和一个信号端构成 参考端一般为地端 ADC单端输入 比如说UART232串口中 发送端TXD 接收端RXD 参考端是地 GND 是典型的单端信号输入
  • 对象相等比较

    String的相等比较 对于String类型而言 一般用 或者equales做相等比较 前者比较字符串的引用 后者比较字符串的值 字符串常量的值存储于常量池中 只要值相同 那么引用的就是同一个字符串常量 也就是说 和equals效果一样 字
  • faster rcnn 训练自己的数据集---踩坑记录!!!

    下载代码 git clone https github com jwyang faster rcnn pytorch git 也可以暴力下载 直接download压缩包 2 解压完 cd到faser rcnn pytorch文件夹中 再创建
  • C++快速排序和一些细节思考

    一 原理 选一个基准数 通常选需要排序数组的第一个元素 将该基准数从两端开始比较 找到从左边起比此基数大的数 从右边起比此基数小的数 然后交换两数 两端相遇后一轮截止 相遇的位置就是基准数的正确位置 且基准数左边都小于此基准数 右边都大于此
  • 固高运动控制卡QT和VS(MFC)的配置

    一 QT配置 第一步 将需要的文件保存在项目下 gts h gts dll gts lib 第二步 将 gts h 加入项目 第三步 在pro文件中添加 lib文件 添加外部库后 代码为 如果不对自己导入外部库即可 win32 LIBS L
  • 【RuoYi-Vue-Plus】问题笔记 07 - V3.5.0 Redisson 报错 Unable to send PING command over channel

    文章目录 前言 参考目录 问题说明 问题解决方法 前言 最近找了一下终于解决了 Redisson 的 RedisTimeoutException 报错问题 在此记录一下 参考目录 Redisson Issues 3273 Redisson
  • 浩辰CAD 2021:深度升级,全面提升用户体验!

    在全球新冠疫情背景下 全球经济发展速度明显减缓 国内国外的市场竞争更加激烈 各企业对于提升数字化 网络化 智能化发展水平的需求也愈发迫切 这就需要企业配备更加全面和系统化的数字化设计平台 提高创新研发能力和市场竞争力 快速响应市场需求 把握
  • UnityVR--机械臂场景4-礼物和圣诞树

    本文场景中被抓取的物体是礼物 使用机械臂抓取礼物 将礼物放置在圣诞树的某个位置 来装饰圣诞树 1 礼物的设置 礼物必须具备Collider和Rigidbody 因为需要手爪放开后 礼物会自由掉落的效果 还要将礼物设置为 Goods 的标签
  • 十句话,不黄不色,但很经典~~~~~~~~~~

    1 如果钱还宽裕 别养二奶 偷偷养几个贫困山区的学生 别让人家知道你是谁 要不然见面了多尴尬 多不好意思 但是你心里一定会觉得舒坦 比包二奶提心吊胆的要好得多 如果真想包也可以包一个 好事坏事一起做 人吗 本来就复杂 2 遇到夜里摆地摊的
  • 浅谈 C/C++ 的条件编译

    1 条件编译的时机 我们都知道vscode其实是一个编辑器 你要在上面跑C或者C 你需要配置编译器 拿编译器是怎样吧一个文本文件变成一个可执行文件的呢 那必然是经历以下这四步 预处理 宏替换 头文件的展开 去注释 条件编译 编译 将预处理后
  • go语言-数组指针

    1 数组指针 1 数组指针与指针数组 这俩概念原本在c语言中就是一个绕口令般的存在 尽管从类型角度来看两者并没什么相似的地方 但是在go语言中对这两个类型的设定做出了一些不同的规定 首先交代一下基本概念 数组指针 指的是一个指针 只不过这个