为什么在Go/C中需要使用指针来给变量赋值,而在C#/Java中不需要?

huangapple go评论82阅读模式
英文:

Why we need Pointers for assigning a value to a variable in Go/C but not C#/Java

问题

这是一个普遍的问题,但现在我正在使用Go和C#进行工作。假设我们想要在Go中将一个变量赋值为用户的输入:

func main() {
    var input float64
    fmt.Scan(&input)
}

很明显,我们需要一个内存位置来存储新值。但是为什么在像Java或C#这样的语言中,我们没有遵循相同的逻辑:

var input = Convert.ToInt32(Console.ReadLine());
// 而不是 &input ...

在Java和C#中,变量是通过值传递的,而不是通过引用传递。这意味着当我们将用户输入的值赋给变量时,实际上是将值复制给变量,而不是将变量的内存地址传递给输入函数。因此,在这些语言中,我们不需要使用&操作符来获取变量的内存地址。

另外,Java和C#提供了内置的输入函数(例如Console.ReadLine()),它们会自动将用户输入的字符串转换为适当的数据类型。在这种情况下,我们使用Convert.ToInt32()将输入的字符串转换为整数类型。

英文:

It's a actually a general question, but it occurred now that I'm working with Go and C#.
Say we want to assign a variable from user's input in Go:

func main() {
    var input float64
    fmt.Scan(&input)
}

It's pretty much clear why we need a memory location to put our new value in. But why in languages like Java or C#, we are not following the same logic:

var input = Convert.ToInt32(Console.ReadLine());
// and not &input ...

答案1

得分: 2

Java和C#是高级语言,它们抽象了大部分内存管理和其他低级语言(如C语言)中所需的特定操作。

在这种情况下,Console.ReadLine()函数分配内存来存储控制台输入,并将其复制到input变量中。

由于这些语言具有垃圾回收机制,内存的分配和释放是自动完成的,因此框架不需要你显式地传递内存地址进行写入,并且不要求你在使用完毕后释放内存。

编辑:

请参考@kostix的评论,对这个答案进行了很好的改进。

英文:

Java and C# are higher level languages which abstract most of the memory management and other particular things required in lower level languages like C.

In this case, the Console.ReadLine() function allocates memory to store the console input and copies it to the input variable.

Since these languages have garbage collection, allocating and deallocating memory is done automatically, so the framework don't require you to explicitly pass a memory address to write to, and doesn't expect you to free the memory when you are done using it.

Edit:

See @kostix comment for a great improvement to this answer.

答案2

得分: 1

在Go语言中,就像C/C++一样,指针变量是通过引用传递类型的方式。

像Java和C#这样的语言不鼓励使用指针变量。C#中有"ref"关键字和"boxing"来通过引用传递值类型。

在这里可以了解更多关于"ref"的信息:https://msdn.microsoft.com/en-us/library/14akc2c7.aspx
在这里可以了解更多关于"boxing"的信息:https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

英文:

In Go, like C/C++, pointer variables are how types can be passed by reference.

Languages like Java and C# discourage the use of pointer variables. C# has the "ref" keyword and "boxing" for passing value types by reference.

See here for more on "ref": https://msdn.microsoft.com/en-us/library/14akc2c7.aspx
See here for more on "boxing: https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

huangapple
  • 本文由 发表于 2015年12月30日 02:51:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/34517179.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定