You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go指针数组赋值疑问:为何用*sampleArray[0]而非直接赋值?

你的Go指针数组疑问详解

刚接触指针确实容易绕晕,我来一步步给你把这几个问题拆解得明明白白~

先搞清楚sampleArray的本质

你定义的sampleArray是一个指针数组,类型是[5]*int——意思是数组里的每一个元素,都是一个*int(指向整数的指针),而不是普通的整数。

当你写sampleArray := [5]*int{0: new(int), 1: new(int)}时:

  • new(int)会在内存里开辟一块能存整数的空间,然后返回这块空间的地址(也就是*int类型的指针);
  • 所以数组的索引0和1,现在各自持有一个指向有效内存的指针;
  • 剩下的索引2-4,因为没初始化,默认是nil指针(不指向任何内存)。

为什么不能直接写sampleArray[0] = 10?

这是Go的强类型特性导致的:

  • sampleArray[0]的类型是*int(指针),而10是int(普通整数);
  • Go不允许把不同类型的值直接赋值,就像你不能把苹果塞进橘子筐里一样,编译器会直接报错:cannot use 10 (type int) as type *int in assignment。

简单说:这个数组的元素是“指针”,不是“整数”,你不能直接把整数塞进去。

为什么不能用&sampleArray[0] = 10?

这个写法有两个致命问题:

  1. 类型完全不匹配:&sampleArray[0]是取sampleArray[0]这个元素的地址,它的类型是**int(指向指针的指针),和10的int类型八竿子打不着;
  2. 语法错误:&sampleArray[0]是一个“右值”——你只能读取它的值(也就是地址),但不能给它赋值。赋值语句的左边必须是一个可以被修改的“左值”(比如变量、解引用后的指针),所以这个写法本身就不符合Go的语法规则。

正确写法*sampleArray[0] = 10到底在做什么?

这个写法的核心是解引用操作(*符号),我们一步步拆:

  1. 先取sampleArray[0]:得到的是一个*int指针(就是之前new(int)返回的那个地址);
  2. 用*解引用这个指针:意思是“去找到这个指针指向的内存空间”;
  3. 把10赋值给这个内存空间:相当于把整数10存在了new(int)开辟的那块内存里。

这样操作后,sampleArray[0]这个指针依然指向原来的内存,只是内存里的内容变成了10。

额外补充:还有其他赋值方式吗?

如果你想让指针指向一个已有的整数变量,也可以这么写:

var num1 int = 10
sampleArray[0] = &num1

这里&num1是取变量num1的地址,把这个地址赋值给sampleArray[0](类型匹配,都是*int)。后续修改num1或者*sampleArray[0],都会影响同一个值,因为它们指向同一块内存。

而之前的*sampleArray[0] = 10,是直接给new(int)创建的匿名内存赋值,没有关联到任何命名变量。

内容的提问来源于stack exchange,提问作者somejkuser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:05:48