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