golang 指针总结(与C/C++区别不大,就是不可以p+1偏移)
生活随笔
收集整理的這篇文章主要介紹了
golang 指针总结(与C/C++区别不大,就是不可以p+1偏移)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
注意
老司機(jī),都知道,可以在C/C ++中隊(duì)指針做計(jì)算,但是golang就不支持那樣做了。
package mainfunc main() {var x = 67var p = &xvar p1 = p + 1 // Compiler Error: invalid operation }但是,golang中可以使用==運(yùn)算符來(lái)比較兩個(gè)相同類型的指針是否相等。包主要package mainimport "fmt" func main() {var a = 3014var p1 = &avar p2 = &aif p1 == p2 {fmt.Printf("chongchong p1(%x) = p2(%x) value(%d): \n",p1,p2,*p1)} }?
認(rèn)識(shí)指針地址和指針類型
package mainimport ("fmt" )func main() {var cat int = 1var str string = "banana"fmt.Printf("%p %p", &cat, &str) }運(yùn)行結(jié)果:
0xc042052088 0xc0420461b0
代碼說(shuō)明如下:
- 第 8 行,聲明整型變量?cat。
- 第 9 行,聲明字符串變量?str。
- 第 10 行,使用 fmt.Printf 的動(dòng)詞%p打印 cat 和 str 變量的內(nèi)存地址,指針的值是帶有0x十六進(jìn)制前綴的一組數(shù)據(jù)。
從指針獲取指針指向的值
package mainimport ("fmt" )func main() {// 準(zhǔn)備一個(gè)字符串類型var house = "Malibu Point 10880, 90265"// 對(duì)字符串取地址, ptr類型為*stringptr := &house// 打印ptr的類型fmt.Printf("ptr type: %T\n", ptr)// 打印ptr的指針地址fmt.Printf("address: %p\n", ptr)// 對(duì)指針進(jìn)行取值操作value := *ptr// 取值后的類型fmt.Printf("value type: %T\n", value)// 指針取值后就是指向變量的值fmt.Printf("value: %s\n", value)}運(yùn)行結(jié)果:
ptr type: *string
address: 0xc0420401b0
value type: string
value: Malibu Point 10880, 90265
代碼說(shuō)明如下:
- 第 10 行,準(zhǔn)備一個(gè)字符串并賦值。
- 第 13 行,對(duì)字符串取地址,將指針保存到變量 ptr 中。
- 第 16 行,打印變量?ptr 的類型,其類型為 *string。
- 第 19 行,打印 ptr 的指針地址,地址每次運(yùn)行都會(huì)發(fā)生變化。
- 第 22 行,對(duì) ptr 指針變量進(jìn)行取值操作,變量 value 的類型為 string。
- 第 25 行,打印取值后 value 的類型。
- 第 28 行,打印 value 的值。
使用指針修改值
package mainimport "fmt"// 交換函數(shù) func swap(a, b *int) {// 取a指針的值, 賦給臨時(shí)變量tt := *a// 取b指針的值, 賦給a指針指向的變量*a = *b// 將a指針的值賦給b指針指向的變量*b = t }func main() {// 準(zhǔn)備兩個(gè)變量, 賦值1和2x, y := 1, 2// 交換變量值swap(&x, &y)// 輸出變量值fmt.Println(x, y) }運(yùn)行結(jié)果:
2 1
代碼說(shuō)明如下:
- 第 6 行,定義一個(gè)交換函數(shù),參數(shù)為 a、b,類型都為 *int 指針類型。
- 第 9 行,取指針?a 的值,并把值賦給變量?t,t 此時(shí)是 int 類型。
- 第 12 行,取 b 的指針值,賦給指針?a 指向的變量。注意,此時(shí)*a的意思不是取 a 指針的值,而是“a 指向的變量”。
- 第 15 行,將 t 的值賦給指針?b 指向的變量。
- 第 21 行,準(zhǔn)備 x、y 兩個(gè)變量,分別賦值為 1 和 2,類型為 int。
- 第 24 行,取出 x 和 y 的地址作為參數(shù)傳給 swap() 函數(shù)進(jìn)行調(diào)用。
- 第 27 行,交換完畢時(shí),輸出 x 和 y 的值。
使用指針變量獲取命令行的輸入信息
package main// 導(dǎo)入系統(tǒng)包 import ("flag""fmt" )// 定義命令行參數(shù) var mode = flag.String("mode", "", "process mode")func main() {// 解析命令行參數(shù)flag.Parse()// 輸出命令行參數(shù)fmt.Println(*mode) }將這段代碼命名為 main.go,然后使用如下命令行運(yùn)行:
go run main.go --mode=fast
命令行輸出結(jié)果如下:
fast
代碼說(shuō)明如下:
- 第 10 行,通過(guò) flag.String,定義一個(gè) mode 變量,這個(gè)變量的類型是 *string。后面 3 個(gè)參數(shù)分別如下:
- 參數(shù)名稱:在命令行輸入?yún)?shù)時(shí),使用這個(gè)名稱。
- 參數(shù)值的默認(rèn)值:與 flag 所使用的函數(shù)創(chuàng)建變量類型對(duì)應(yīng),String 對(duì)應(yīng)字符串、Int 對(duì)應(yīng)整型、Bool 對(duì)應(yīng)布爾型等。
- 參數(shù)說(shuō)明:使用 -help 時(shí),會(huì)出現(xiàn)在說(shuō)明中。
- 第 15 行,解析命令行參數(shù),并將結(jié)果寫(xiě)入到變量 mode 中。
- 第 18 行,打印 mode 指針?biāo)赶虻淖兞俊?/li>
創(chuàng)建指針的另一種方法——new() 函數(shù)
Go語(yǔ)言還提供了另外一種方法來(lái)創(chuàng)建指針變量,格式如下:
new(類型)
一般這樣寫(xiě):
str := new(string) *str = "Go語(yǔ)言教程"fmt.Println(*str)?
總結(jié)
以上是生活随笔為你收集整理的golang 指针总结(与C/C++区别不大,就是不可以p+1偏移)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java 文件操作二(重命名、设置只读、
- 下一篇: C/C++获取指定网口的IP地址