【发布时间】:2021-12-04 18:18:16
【问题描述】:
我注意到在 golang 中我们可以使用指向数组的指针,如下所示:
arr := [3]int{1, 2, 3}
var ptr *[3]int = &arr
要获取存储在索引 n 处的值,我们可以使用 (*ptr)[n],但为什么 ptr[n] 也会获取值,它不应该输出一些随机地址吗?
上下文
在 C++ 中,这是观察到的行为
int (*ptr)[5];
int arr[] = {1,2,3,4,5};
ptr = &arr;
cout <<"ptr[1] = " << ptr[1] <<endl; //Outputs an address (base address of array + 20bytes)
cout << "(*ptr)[1] = " << (*ptr)[1]<< endl; //Outputs 2
【问题讨论】:
-
在 C++ 中有array-to-pointer decay(从数组类型的值到指针类型的值的隐式转换),但在 Go 中没有相同的转换。
-
Go 故意省略了所有你可以用 C 和 C++ 中的指针对自己做的可怕事情。结果是您不会意外地射中自己的脚(C),或者意外地创建自己的许多实例并射中所有的脚(C++)。另请参阅www-users.cs.york.ac.uk/susan/joke/foot.htm