指针( Pointers)
Go中的指针简单易学。 使用指针可以更轻松地执行某些Go编程任务,而不使用指针就无法执行其他任务(如通过引用调用)。 所以有必要学习指向成为一个完美的Go程序员。
如您所知,每个变量都是一个内存位置,每个内存位置都定义了其地址,可以使用和号(&)运算符进行访问,该运算符表示内存中的地址。 考虑以下示例,它将打印定义的变量的地址 -
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("Address of a variable: %x\n", &a )
}
编译并执行上述代码时,会产生以下结果 -
Address of a variable: 10328000
所以你了解什么是内存地址以及如何访问它。 现在让我们看看指针是什么。
什么是指针?
pointer是一个变量,其值是另一个变量的地址,即存储器位置的直接地址。 与任何变量或常量一样,必须先声明指针,然后才能使用它来存储任何变量地址。 指针变量声明的一般形式是 -
var var_name *var-type
这里, type是指针的基类型; 它必须是有效的C数据类型, var-name是指针变量的名称。 用于声明指针的星号*与用于乘法的星号相同。 但是,在此语句中,星号用于将变量指定为指针。 以下是有效的指针声明 -
var ip *int /* pointer to an integer */
var fp *float32 /* pointer to a float */
所有指针的值的实际数据类型,无论是整数,浮点还是其他,都是相同的,是表示内存地址的长十六进制数。 不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型。
如何使用指针?
有一些重要的操作,我们经常使用指针执行:(a)我们定义指针变量,(b)将变量的地址分配给指针,以及(c)访问存储在指针变量中的地址的值。
所有这些操作都使用一元运算符*来执行,该运算符*返回位于其操作数指定的地址处的变量的值。 以下示例演示了如何执行这些操作 -
package main
import "fmt"
func main() {
var a int = 20 /* actual variable declaration */
var ip *int /* pointer variable declaration */
ip = &a /* store address of a in pointer variable*/
fmt.Printf("Address of a variable: %x\n", &a )
/* address stored in pointer variable */
fmt.Printf("Address stored in ip variable: %x\n", ip )
/* access the value using the pointer */
fmt.Printf("Value of *ip variable: %d\n", *ip )
}
编译并执行上述代码时,会产生以下结果 -
Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20
Go中没有指针
如果您没有要分配的确切地址,Go编译器会将Nil值分配给指针变量。 这是在变量声明时完成的。 指定为nil指针称为nil指针。
nil指针是一个常量,在几个标准库中定义了零值。 考虑以下程序 -
package main
import "fmt"
func main() {
var ptr *int
fmt.Printf("The value of ptr is : %x\n", ptr )
}
编译并执行上述代码时,会产生以下结果 -
The value of ptr is 0
在大多数操作系统上,程序不允许访问地址0处的内存,因为该内存是由操作系统保留的。 但是,存储器地址0具有特殊意义; 它表示指针不是指向可访问的内存位置。 但按照惯例,如果指针包含nil(零)值,则假定它指向任何值。
要检查nil指针,可以使用if语句,如下所示 -
if(ptr != nil) /* succeeds if p is not nil */
if(ptr == nil) /* succeeds if p is null */
Go指针细节
指针有许多但很简单的概念,它们对Go编程非常重要。 Go程序员应该清楚以下指针概念 -
Sr.No | 概念与描述 |
---|---|
1 | Go - 指针数组 您可以定义数组以包含许多指针。 |
2 | Go - 指向指针 Go允许您在指针上指针等等。 |
3 | 将指针传递给Go中的函数 通过引用或地址传递参数都可以通过被调用函数在调用函数中更改传递的参数。 |