日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

golang 指针总结(与C/C++区别不大,就是不可以p+1偏移)

發布時間:2025/3/15 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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偏移)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。