> For the complete documentation index, see [llms.txt](https://minilabmemo.gitbook.io/golang-memo/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://minilabmemo.gitbook.io/golang-memo/basic/go-basic/pointer.md).

# Pointer

指標/ 指针/Pointer

#### 指標 <a href="#xuan-gao-zhi-biao" id="xuan-gao-zhi-biao"></a>

指標是一個變數，用來儲存另一個變數的記憶體位址

& 運算子取得變數的位址&#x20;

\* 運算子來存取儲存在指標所指向的變數中的值

#### 宣告指標 <a href="#xuan-gao-zhi-biao" id="xuan-gao-zhi-biao"></a>

* 宣告一個型別為 T 的指標 `var p`` `<mark style="color:blue;">`*T`</mark> 指標的[零值](https://calvertyang.github.io/2019/11/05/golang-variables-zero-values-type-inference/)為 `nil`
* 可用內建new(T)拿到宣告指標，初始值根據type

{% hint style="warning" %}

#### Go 沒有指標運算 <a href="#go-mei-you-zhi-biao-yun-suan" id="go-mei-you-zhi-biao-yun-suan"></a>

C/C++這些語言支援指標運算。可以遞增/遞減指標來移動到下一個/上一個記憶體位址，可以對指標增加或減去一個整數值，你也可以使用關係運算子 `==`、`<`、`>` 等比較兩個指標。

但是Go任何此類運算都會導致編譯時期錯誤。
{% endhint %}

#### 範例

```diff
var p *int
+//指標只能儲存 int 變數的記憶體位址

var p *string
- fmt.Println("p = ", p, "&=", &p) //p =  <nil> 指標的零值為 nil ，不可以印*p=nil

+ person := new(string) //用new拿到宣告指標，初始值根據type
fmt.Println("person:", person, "*=", *person, "&=", &person)
*person = "11"
+ // & 運算子取得變數的位址
+ // * 運算子來存取儲存在指標所指向的變數中的值
fmt.Println("person:", person, "*=", *person, "&=", &person)

- person2 := "string" //非指標
fmt.Println("person2:", person2, "&=", &person2)
- //fmt.Println("person:%v", *person2) //cannot indirect person2

+ person = &person2 //指標是一個變數，可以用來儲存另一個變數的記憶體位址
fmt.Println("person:", person, *person, &person)

+ //如果是指標字串內容比對記得用＊比對

```

#### ref

|                                                                                                                  |                                          |
| ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |
| [在 Golang 與指標共舞](https://calvertyang.github.io/2019/11/15/playing-with-pointers-in-golang/)                      | <p>指標的指標:指標可以指向任何型別的變數<br>Go 沒有指標運算?</p> |
| [Go 语言设计与实现 5.5 make 和 new](https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/) | 有圖                                       |
|                                                                                                                  |                                          |
