學過C語言的老司機都知道,指針就是一個變量,用於存儲另一個變量的內存地址。
那麼什麼是變量呢?在現代計算機體系結構中所有的需要執行的信息代碼都需要存儲在內存中,為了管理存儲在內存的數據,內存是劃分為不同的區域的,不同區域都用內存地址來標識。一個典型的內存地址是個16進制的8位數(一個字節)比如0xAFFFF(這是一個內存地址的十六進制表示)。
要訪問數據,我們需要知道它的存儲地址。我們可以跟蹤存儲與我們的程序相關的數據的所有內存地址。但是要記住這些內存地址,非常費勁,怎麼辦呢?
於是我們引入了變量的概念。變量只是給存儲數據的內存地址的好記得別名。指針也是一個變量。但它是一種特殊的變量,因為它存儲的數據不僅僅是一個普通的值,如簡單的整數或字符串,而是另一個變量的內存地址。
在上面的圖中,指針p包含變量a的地址值0x0001。
The of a pointer is nil. That means any uninitialized pointer will have the value nil. Let's see a complete example -
package main
import "fmt"
func main() {
var p *int
fmt.Println("p = ", p)
}
# Output
p =
//類型T的指針
var p *T
類型T是指針指向的變量的類型。比如整型指針:
//類型為整型指針
var p *int
p指針只能保存int變量的內存地址。
指針的零值,不是0,而是nil。任何未初始化的指針值都為nil。我們直接擼一個代碼:
package main
import "fmt"
func main() {
var p *int
fmt.Println("chongchong p = ", p)
}
初始化指針
初始化一個指針,只需給他賦予其他變量的內存地址接口。變量的地址可以使用使用&運算符獲得:
var x = 100
var p *int = &x
上面我們通過對x做&運算符來獲取其地址,然後將該地址分配給指針p。
var p = &x
擼代碼之例2 :
package main
import "fmt"
func main() {
var a = 3.1415926
var p = &a
fmt.Println("chongchong value a = ", a)
fmt.Println("chongchong Address a = ", &a)
fmt.Println("chongchong value p = ", p)
}
輸出結果
指針解引用
要獲得指針指向地址的值,我們可以使用*運算符。這叫解引用。
package main
import "fmt"
func main() {
var a = 100
var p = &a
fmt.Println("chongchong a = ", a)
fmt.Println("chongchong p = ", p)
fmt.Println("chongchong *p = ", *p)
}
輸出入下:
通過*運算符不僅能取值,還可以對指向變量值做修改。以下示例通過指針p設置存儲在變量a中的值:
package main
import "fmt"
func main() {
var a = 8888
var p = &a
fmt.Println("chongchong a = ", a)
*p +=1112
fmt.Println("chongchong a(altered)= ", a)
}結果如下:
多重指針
指針可以指向任何類型的變量。所以也可以指向另一個指針。以下示例顯示如何創建指向另一個指針的指針:
package main
import "fmt"
func main() {
var a = 3.141596
var p = &a
var pp = &p
fmt.Println("a = ", a)
fmt.Println("chong address a = ", &a)
fmt.Println("p = ", p)
fmt.Println("chongchong p = ", &p)
fmt.Println("pp = ", pp)
fmt.Println("chongchong *pp = ", *pp)
fmt.Println("chongchong **pp = ", **pp)
}
結果輸出為
Go中沒有指針算術
老司機,都知道,可以在C/C ++中隊指針做計算,但是golang就不支持那樣做了。
package main
func main() {
var x = 67
var p = &x
var p1 = p + 1 // Compiler Error: invalid operation
}
但是,golang中可以使用==運算符來比較兩個相同類型的指針是否相等。
包主要
package main
import "fmt"
func main() {
var a = 3014
var p1 = &a
var p2 = &a
if p1 == p2 {
fmt.Printf("chongchong p1(%x) = p2(%x) value(%d): \n",p1,p2,*p1)
}
}
結果為:
閱讀更多 蟲蟲安全 的文章