---
# System prepended metadata

title: 指標
tags: [Golang]

---

###### tags: `Golang`

# 指標

### 指標變數
指向計位址的變數，是為一種型別，可當做變數使用的都是一種型別。
指標變數的初始值皆是nil，代表尚未指派位址，
```go=
var ptr *string
fmt.Printf("%p \n",ptr)
// 0X0

if ptr == nil{
fmt.Println("ptr is nil")
}
```

完成宣告變數後，可透過**取址符號「&」**，取出該字串之記憶體位址，然後賦值給ptr，
透過格式化輸出(%p)可印出記憶體位址，若是想要取得該記憶體位址的值，
就必須使用**取值符號「*」**，取出指標所指向記憶體位址所儲存的值。

```go=
// * -> 取值符號
// & -> 取址符號
var ptr *string //宣告指標變數
str := "Iron"   //宣告字串變數及初始化值

ptr = &str               //將str的記憶體位址給ptr

fmt.Printf("%p \n", ptr) //印出str的記憶體位址
fmt.Printf("%s \n", *ptr) //印出該位址的值
fmt.Printf("字串變數str的記憶位址為%p，值為%s \n", ptr, *ptr)

//0xc0000961e0 
//Iron 
//字串變數str的記憶位址為0xc0000961e0，值為Iron
```

### 型別區分
指標變數的型別以所要指向的變數型別為主，若要指向string變數，
宣告指標變數時就要以string做宣告，
變數型別與指標變數型別不一樣時，則會出錯。

### 指標與函數
**取值符號「*」** 可以讀取也可以修改，swap宣告兩個指標變數接收變數的記憶體位址，
並將該記憶體位址的值交換，如此可達成不須return也能取得函式結果。
```go=
func swap(a, b *int) { //此函式宣告了a和b兩個指標變數
	*a, *b = *b, *a //將該位址的值做交換
}

func main() {
	a, b := 1, 2
	swap(&a, &b) //傳送變數的記憶體位址
	fmt.Printf("a:%d / b:%d \n", a, b)
}

```

### new()
動態產生一個變數空間，即先產生一個彈性的記憶體空間，依據所存入值的大小做改變，
適用於操作大量且不固定的記憶體空間。
```go=
ptr := new(string)
fmt.Printf("記憶體位址： %p,值：%s\n", ptr, *ptr)    //存入值之前就有記憶體位址
*ptr = "Iron"
fmt.Printf("記憶體位址： %p,值：%s\n", ptr, *ptr)
//記憶體位址： 0xc0000961e0,值：
//記憶體位址： 0xc0000961e0,值：Iron
```

# Dark Theme CSS

{%hackmd theme-dark %}