最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言中的數(shù)組指針和指針數(shù)組的區(qū)別小結

 更新時間:2024年10月05日 10:05:16   作者:傾城璧  
本文主要介紹了go語言中的數(shù)組指針和指針數(shù)組的區(qū)別小結,文中通過示例代碼介紹的很詳細,具有一定的參考價值,感興趣的可以了解一下

1.介紹

大家知道C語言之所以強大,就是因為c語言支持指針,而且權限特別大,c語言可以對計算機中任何內存的指針進行操作,這樣自然而然也會帶來一些不安全的因素,所以在golang中,「取消了對指針的一些偏移,翻轉等算術運算」(+、-、++、--)所以使用起來更安全。

  • 數(shù)組指針 :它是一個指針,但是數(shù)據(jù)類型為數(shù)組,或者說指向數(shù)組
  • 指針數(shù)組 :它是一個數(shù)組,該數(shù)組的元素都為地址值

2.數(shù)組指針

 在Go語言中,數(shù)組是一個固定長度的相同類型元素的序列。數(shù)組在聲明時必須指定其長度,并且一旦創(chuàng)建,其長度就不能改變。

數(shù)組指針是指指向數(shù)組的指針。在Go語言中,你可以使用`&`操作符來獲取數(shù)組的地址,從而創(chuàng)建一個指向數(shù)組的指針。數(shù)組指針的類型是`*[長度]類型`。

var 變量名 *[數(shù)組大小] 數(shù)組類型:

var arrPtr *[size] Type

初始化指針可以通過 new 函數(shù)來分配內存并返回指針的地址:

p := new(int)  // 分配一個 int 類型的內存,并將指針 p 指向該內存

 因為數(shù)組指針是一個指針,所以在定義時,先寫 *, 表示定義一個指針,后面接數(shù)據(jù)類型

運行結果: 

 注意,輸出的結果不是地址(不是 16 進制的數(shù)),在 Golang 中,直接輸出的是&[元素 1 元素 2 ……]

我們可以輸出一下二者的地址:

fmt.Printf("arr 數(shù)組的地址為:%p\n", &arr)   
fmt.Printf("arrPtr 存儲的地址為:%p\n", arrPtr)

可以看到,它倆的輸出時一樣的,因為將數(shù)組 arr 的地址賦值給了 arrPtr,而 arrPtr 是一個指針,存儲的是內存地址。

當然 arrPtr 也有自己的內存地址,我們可以看一下:

fmt.Printf("arrPtr 指針自己的地址為:%p\n", &arrPtr)

輸出為:

arrPtr 指針自己的地址為:0xc000006028

2.1獲取指針的地址和解使用

通過 & 操作符可以獲取變量的地址,例如:

 x := 10
 p := &x  // 將指針 p 指向變量 x 的地址
 ?
 a := 10
 b := &a // 將指針 b 指向變量 a 的地址

 使用 * 操作符可以解引用指針,獲取指針指向的值 :

fmt.Println(*p)  // 輸出指針 p 指向的值,即變量 x 的值

 輸出結果:

 type of b:*int
 type of c:int
 value of c:10

 取地址操作符 & 和取值操作符 * 是一對互補操作符,& 取出地址,* 根據(jù)地址取出地址指向的值。

3.通過指針訪問數(shù)組

訪問數(shù)組的元素可以通過下標來訪問,比如:arr [0] 即可訪問數(shù)組 arr 的第一個元素。

但是我們學習了指針數(shù)組,所以嘗試使用指針數(shù)組來訪問元素內容,在 Golang 中,取地址的操作為 * (尋址運算符) 。

因此,我們先取存儲的地址 *arrPtr,訪問到數(shù)組 ,然后再下標取值 *arrPt[0],代碼如下:

*arrPtr[0]
  • 實際上,這段代碼編譯就會報錯,因為在 Golang 中 * 尋址運算符和 [] 中括號運算符的優(yōu)先級是不同的!
  • [] 中括號是初等運算符
  • 尋址運算符是單目運算符
  • 初等運算符的優(yōu)先級是大于單目運算符的,因此先參與計算的是 arrPtr[0],arrPtr[0] 其實就是數(shù)組的第一個元素,就是數(shù)字 1。
  • 數(shù)字 1 必然是 int 類型,而不是一個地址,因此針對數(shù)字 1 使用 * 尋址運算符自然也就發(fā)生了錯誤。

解決問題的辦法很簡單,就是添加一個小括號,更改運算優(yōu)先級即可:  

(*arrPtr)[0]
  • 不過因為 * 在 Golang 中,建立了 arrPtr := &arr 這種類似地址關系后,* 允許不寫。
  • 所以,訪問時候可以直接寫成 arrPtr[0]。事實上在工作開發(fā)過程中,這種寫法反而更加常見。實戰(zhàn)代碼:
fmt.Println("(*arrPtr)[0] 通過指針訪問數(shù)組的第一個元素:", (*arrPtr)[0])
fmt.Println("arrPtr[0] 通過指針訪問數(shù)組的第一個元素:", arrPtr[0])

 輸出:

(*arrPtr)[0] 通過指針訪問數(shù)組的第一個元素: 1
arrPtr[0] 通過指針訪問數(shù)組的第一個元素: 1

4.指針數(shù)組

在Go語言中,指針數(shù)組是指一個數(shù)組,其元素時指針,指針元素通常用于存儲多個指針,這些指針可以指向不同類型的數(shù)據(jù)結構,如結構體,數(shù)組,基本數(shù)據(jù)類型等等。

它是一個數(shù)組,該數(shù)組的元素都為地址值

var 變量名 [數(shù)組大小] * 數(shù)組類型:

var ptrArr [size] *Type

因為指針數(shù)組是一個數(shù)組,所以在定義時,先寫 [size], 表示定義一個數(shù)組,后面再接指針 * 和 數(shù)組的數(shù)據(jù)類型

實例:

1. 創(chuàng)建一個數(shù)組指針, 數(shù)組的類型為 int,大小為 4,并賦值:

package main
import "fmt"

func main() {
 var ptrArr [4]*int 
 a,b,c,d := 1,2,3,4
  
 arr2 :=[4]int{a,b,c,d}//拷貝四個變量的值為函數(shù)組元素
 fmt.Println(arr2)

 ptrArr =[4]*int{&a,&b,&c,&d}//拷貝四個變量的地址值給函數(shù)組元素
 fmt.Println(ptrArr)
}

輸出:

數(shù)組 arr2 : [1 2 3 4]
指針數(shù)組 ptrArr : [0xc0000140f0 0xc0000140f8 0xc000014100 0xc000014108]

2. 操作數(shù)據(jù),查看變化

(1).arr2 的第一個元素改變,a 會不會變化,ptrArr 會不會變化?

arr2[0] = 100     
fmt.Println("arr2 的值為:", arr2)                      
fmt.Println("a 的值為;", a)               
fmt.Println("ptrArr 的值為;", *ptrArr[0])

輸出:

arr2 的值為: [100 2 3 4]
a 的值為; 1
ptrArr 的值為; 1

先看 a 的值為 1 解釋:

在 Golang 中,int,float,bool,string,array,struct 都屬于值類型,數(shù)據(jù)拷貝時都是值拷貝,拷貝副本過來。

因此,盡管 arr2[0] = 100 執(zhí)行了,只是修改了 arr2 的值,原來 a 的值不會受任何影響。因此,a 的值仍為 1

ptrArr 的值為 1 解釋:

ptrArr 是指針數(shù)組, 該數(shù)組存儲都是 指針,也就是 a,b,c,d 四個變量的內存地址。

其中,*ptrArr[0] 存儲的是 a 的內存地址;a 沒變, *ptrArr[0] 也不會變。所以輸出仍為 1

我們可以查看一下 ptrArr[0] 的值和 a 的地址是否一致:

fmt.Println("ptrArr[0] 的值:", ptrArr[0])
fmt.Printf("a 的內存地址為:%p\n", &a)  // %p 占位符表示地址值

輸出:

ptrArr[0] 的值: 0xc0000140f0
a 的內存地址為:0xc0000140f0

(2). 指針數(shù)組變化,a,b,c,d 會不會改變? 數(shù)組 arr2 會不會改變?

*ptrArr[0] = 1000  // 指針數(shù)組的第一個元素地址指向的值發(fā)生改變
fmt.Println("a 的值為:", a)       
fmt.Println("arr2 的值為:", arr2)

輸出:

a 的值為: 1000
arr2 的值為: [100 2 3 4]

a 的值為: 1000 解析:

首先要明白一點:*ptrArr[0] = 1000 這段代碼不會編譯報錯,因為 ptrArr 是指針數(shù)組,按照運算符的執(zhí)行順序,先 ptrArr[0] 獲取 a 的地址,然后再 *a,這樣獲取的就是 a 的值

其實,解析的已經差不多了,ptrArr[0] 本來就是 a 的內存地址,所以 *ptrArr[0] = 1000 執(zhí)行后,就改變了 a 的值

arr2 的值為: [100 2 3 4] 解析:

arr2 拷貝了 a,b,c,d 值的副本,a 的改變和 arr2 沒有關系的,各不會受影響。a 和 arr2 都是值類型,各自改變,互不影響

 到此這篇關于go語言中的數(shù)組指針和指針數(shù)組的區(qū)別小結的文章就介紹到這了,更多相關go 數(shù)組指針和指針數(shù)組內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言獲取本機邏輯CPU數(shù)量的方法

    Go語言獲取本機邏輯CPU數(shù)量的方法

    這篇文章主要介紹了Go語言獲取本機邏輯CPU數(shù)量的方法,實例分析了runtime庫的操作技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言使用Buffer實現(xiàn)高性能處理字節(jié)和字符

    Go語言使用Buffer實現(xiàn)高性能處理字節(jié)和字符

    在?Go?中,bytes.Buffer?是一個非常高效的類型,用于處理字節(jié)數(shù)據(jù)的讀寫操作,本文將詳細介紹一下如何使用Buffer實現(xiàn)高性能處理字節(jié)和字符,有需要的小伙伴可以了解下
    2025-01-01
  • windows下使用GoLand生成proto文件的方法步驟

    windows下使用GoLand生成proto文件的方法步驟

    本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 詳解Go微服務容錯設計(熔斷+降級+限流全解析)

    詳解Go微服務容錯設計(熔斷+降級+限流全解析)

    本文概述了Go微服務容錯設計,包括超時控制、重試機制、熔斷機制和降級策略,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-04-04
  • go語言yaml轉map、map遍歷的實現(xiàn)

    go語言yaml轉map、map遍歷的實現(xiàn)

    本文主要介紹了go語言yaml轉map、map遍歷的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語言開發(fā)實現(xiàn)一個圖片批量壓縮工具

    Go語言開發(fā)實現(xiàn)一個圖片批量壓縮工具

    在日常開發(fā)和辦公中,圖片體積過大會帶來不少困擾,本文將使用Go語言編寫一個圖片批量壓縮工具,文中的示例代碼講解詳細,需要的可以了解下
    2025-09-09
  • Go項目中使用Casbin實現(xiàn)RBAC權限管理教程

    Go項目中使用Casbin實現(xiàn)RBAC權限管理教程

    本文主要介紹了Go項目中使用Casbin實現(xiàn)RBAC權限管理教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-01-01
  • GoLang中生成UUID唯一標識的實現(xiàn)

    GoLang中生成UUID唯一標識的實現(xiàn)

    這篇文章主要介紹了GoLang中生成UUID唯一標識的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言壓縮和解壓縮tar.gz文件的方法

    Go語言壓縮和解壓縮tar.gz文件的方法

    這篇文章主要介紹了Go語言壓縮和解壓縮tar.gz文件的方法,實例分析了使用Go語言壓縮文件與解壓文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • go語言go?func(){select{}}()的用法

    go語言go?func(){select{}}()的用法

    本文主要介紹了go語言go?func(){select{}}()的用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02

最新評論

江陵县| 社旗县| 磐石市| 抚远县| 定远县| 板桥市| 舞阳县| 宁晋县| 重庆市| 射洪县| 南宫市| 恩平市| 关岭| 上蔡县| 上高县| 杨浦区| 山阳县| 北流市| 西贡区| 巢湖市| 襄垣县| 逊克县| 长岛县| 阳城县| 抚州市| 卫辉市| 原阳县| 驻马店市| 浪卡子县| 广灵县| 桐乡市| 阳春市| 仙桃市| 五莲县| 义马市| 新建县| 巫山县| 永福县| 寻乌县| 于都县| 沁水县|