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?
这个写法有两个致命问题:
- 类型完全不匹配:
&sampleArray[0]是取sampleArray[0]这个元素的地址,它的类型是**int(指向指针的指针),和10的int类型八竿子打不着; - 语法错误:
&sampleArray[0]是一个“右值”——你只能读取它的值(也就是地址),但不能给它赋值。赋值语句的左边必须是一个可以被修改的“左值”(比如变量、解引用后的指针),所以这个写法本身就不符合Go的语法规则。
正确写法*sampleArray[0] = 10到底在做什么?
这个写法的核心是解引用操作(*符号),我们一步步拆:
- 先取
sampleArray[0]:得到的是一个*int指针(就是之前new(int)返回的那个地址); - 用
*解引用这个指针:意思是“去找到这个指针指向的内存空间”; - 把
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
相关产品推荐
相关产品推荐

