對於指標陣列和陣列指標在c或c++中也經常被討論,尤其對於初學者來說會分辨不清楚。其實在每個詞中間新增乙個「的「就很好理解了,指標的陣列,陣列的指標。本文就通過go語言來分別解釋一下陣列指標與指標陣列。
對於指標陣列來說,就是:乙個陣列裡面裝的都是指標,在go語言中陣列預設是值傳遞的,所以如果我們在函式中修改傳遞過來的陣列對原來的陣列是沒有影響的。
func
main()
func
test
(a [5]
int)輸出[
0000
0][0
2000
][00
000]
但是如果我們乙個函式傳遞的是指標陣列,情況會有什麼不一樣呢?
func
main()
for i :=
0; i <
5; i++
fmt.
println()
test1
(a)for i :=
0; i <
5; i++
}func
test1
(a [5]
*int
) fmt.
println()
}
我們先來看一下程式的執行結果
[
<
nil>
<
nil>
<
nil>
<
nil>
<
nil>]0
1234
0223
4022
34
可以看到初始化值全是nil,也就驗證了指標陣列內部全都是乙個乙個指標,之後我們將其初始化,內部的每個指標指向一塊記憶體空間。
在初始化的時候如果直接另a[i] = &i那麼指標陣列內部儲存的全是同乙個位址,所以輸出結果也一定是相同的
然後我們將這個指標陣列傳遞給test1函式,對於陣列的引數傳遞仍然是複製的形式也就是值傳遞,但是因為陣列中每個元素是乙個指標,所以test1函式複製的新陣列中的值仍然是這些指標指向的具體位址值,這時改變a[1]這塊儲存空間位址指向的值,那麼原實參指向的值也會變為2,具體流程如下圖所示。
了解了指標陣列之後,再來看一下陣列指標,陣列指標的全稱應該叫做,指向陣列的指標,在go語言中我們可以如下操作。
func
main()
func
test
(aptr *[5
]int
)
我們先定義了乙個陣列a,然後定乙個指向陣列a的指標aptr,然後將這個指標傳入乙個函式,在函式中我們改變了具體的值,程式的輸出結果
通過上面的圖我們可以看見雖然main和test函式中的aptr是不同的指標,但是他們都指向同一塊陣列的記憶體空間,所以無論在main函式還是在test函式中對陣列的操作都會直接改變陣列。
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
go 指標陣列 go語言中的指標陣列
宣告乙個包含有5個整數指標型別的陣列,我們可以在初始化時給相應位置的元素預設值。下面是給索引為0的元素乙個新建的的int型別指標 預設為0 給索引為1的元素指向值v的位址,剩下的沒有指定預設值的元素為指標的zero值也就是nil package main import fmt func main f...
陣列 指標陣列與陣列指標
一 陣列型別 int a 10 printf a d,a 1 d n a,a 1 printf a d,a 1 d n a,a 1 輸出結果 2 陣列元素的首位址是常量,不能修改,這是為了釋放記憶體空間所必需的,否則找不到釋放記憶體空間的首位址了 3 定義乙個陣列型別 定義陣列型別的格式如下 typ...