English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Goプログラミング言語のポインタは、他の変数のメモリアドレスを保存する変数です。Golangのポインタも特別な変数と呼ばれます。変数特定のデータがシステムの特定のメモリアドレスに保存されるために使用されます。常に16進形式でメモリアドレスを見つけることができます(0xで始まる、例えば0xFFAAFなど)。
ポインタの役割は何ですか?
このポインタについて理解するには、まず変数の概念を理解する必要があります。変数は実際のデータの保存場所に名前を付けたものです。データをアクセスするには、特定の保存場所のアドレスが必要です。すべてのメモリアドレス(16進形式)を手動で覚えることは負担です。これが変数を使用してデータを保存し、変数名を通じてデータにアクセスできる理由です。
Golangは、16進数を変数に保存するための文字リテラル表現を使用することも許可しています。すなわち、0x最初の数字は16進数です。
例:以下のプログラムでは、16進数を変数に保存します。しかし、値の型がintまたは、十進数として保存することもできますint型の10進値が保存されていますが、この例の主なポイントは、私たちが保存しているのは16進数値(それをメモリアドレスとして見なします)であり、それはポインタではありません。なぜなら、それは他の変数の他のメモリ位置を指していないからです。それは単なるユーザー定義の変数です。したがって、これはポインタを使用する必要があります。
//16進数値を保存 package main import "fmt" func main() { //16進数を保存 //変数内の値 x := 0xFF y := 0x9C // 表示値 fmt.Printf("変数xの型は %T\n", x) fmt.Printf("xの16進値は %X\n", x) fmt.Printf("xの10進値は %v\n", x) fmt.Printf("変数yの型は %T\n", y) fmt.Printf("yの16進値は %X\n", y) fmt.Printf("yの10進値は %v\n", y) }
出力:
変数xの型はintです xの16進値はFF xの10進値は 255 変数yの型はintです yの16進値は 9C yの10進値は 156
ポインタは、他の変数のメモリアドレスを格納するだけでなく、メモリの位置を指し、そのメモリ位置に格納された値を検索する方法を提供する特別な変数です。これは、ほぼ変数として宣言されていますが、*(アドレス演算子)。
始める前に、ポインタを使用する際に非常に重要な2つの演算子、すなわち
*演算子 アドレス演算子と呼ばれ、ポインタ変数を宣言し、アドレスに格納された値にアクセスするために使用されます。
&演算子 アドレス演算子と呼ばれ、変数のアドレスを返すまたは変数のアドレスをポインタにアクセスするために使用されます。
ポインタの宣言:
var pointer_name *Data_Type
例:以下は文字列型のポインタです。このポインタは、以下をのみ格納できます文字列変数のメモリアドレス。
var s *string
ポインタの初期化:このためには、以下の例のように他の変数のメモリアドレスを使用してポインタを初期化する必要があります:
//通常の変数の宣言 var a = 45 //初期化ポインタsを使用して //変数aのメモリアドレス var s *int = &a
// Golangプログラムで宣言をデモストレーション //およびポインタの初期化 package main import "fmt" func main() { //通常の変数の定義 var x int = 5748 //ポインタの宣言 var p *int //ポインタの初期化 p = &x //表示結果 fmt.Println("xに格納されている値 = ", x) fmt.Println("xのメモリアドレス = ", &x) fmt.Println("変数pに格納されている値 = ", p) }
出力:
xに格納されている値 = 5748 xのメモリアドレス = 0xc000066090 変数pに格納されている値 = 0xc000066090
重要事項:
ポインタのデフォルト値またはゼロ値は常にnilです。または、未初期化のポインタは常にnil値を持つと言えます。
//ポインタのnil値 package main import "fmt" func main() { //ポインタの定義 var s *int // 表示結果 fmt.Println("s = ", s) }
出力:
s = <nil>
ポインタの宣言と初期化は一行で完了できます。
var s *int = &a
データ型とポインタ宣言を同時に指定する場合、ポインタは指定されたデータ型のメモリアドレスを処理できます。例えば、文字列型のポインタを使用する場合、ポインタに提供される変数のアドレスは文字列データ型の変数のアドレスだけであり、他のどんな型でもありません。
上記の問題を克服するために、使用できますvarキーワードの型推論概念です。宣言中に指定するデータ型は必要ありません。ポインタ変数の型も通常の変数と同様にコンパイラが決定できます。ここでは、使用しません*运算符。当我们使用另一个变量的地址初始化变量时,它将由编译器内部确定。
// Golangプログラムでデモ //演算子。他の変数のアドレスを初期化する変数に使用すると、コンパイラは内部でそれが指針変数であると判定します。 //指針変数 package main import "fmt" func main() { //varキーワードを使用 //私たちは定義していません //変数を持つ型のすべて var y = 458 //指針変数を使用 // varキーワード、型を指定しません //型 var p = &y fmt.Println("yに格納された値 = ", y) fmt.Println("yのアドレス = ", &y) fmt.Println("指針変数pに格納された値 = ", p) }
出力:
yに格納された値 = 458 yのアドレス = 0xc0000120a8 指針変数pに格納された値 = 0xc0000120a8
中で型推論を使用省略記法(:=)语法を使用して指針変数を宣言および初期化します。&(アドレス)変数のアドレスを演算子に渡すと、コンパイラはその変数がポインタ変数であると内部で判定します。
// Golangプログラムでデモ //中でショートカット语法を使用 //指針変数 package main import "fmt" func main() { //:=演算子を使用して宣言 //変数を初期化 y := 458 //指針変数を使用 //:=を使って割り当て //変数yのアドレス p := &y fmt.Println("yに格納された値 = ", y) fmt.Println("yのアドレス = ", &y) fmt.Println("指針変数pに格納された値 = ", p) }
出力:
yに格納された値 = 458 yのアドレス = 0xc000066090 指針変数pに格納された値 = 0xc000066090
よく知られています*演算子は、解引用演算子とも呼ばれます。これは指針変数の宣言に限らず、指針が指している変数に格納された値にアクセスするために使用され、通常、間接またはアンラップリング。*演算子は、アドレスの値とも呼ばれます。この概念をよりよく理解するために、例を示しましょう:
// Golangプログラムで説明 //指針アンラップリングの概念 package main import "fmt" func main() { //varキーワードを使用 //私たちは定義していません //変数を持つ型のすべて var y = 458 //指針変数を使用 // varキーワード、型を指定しません //型 var p = &y fmt.Println("yに格納された値 = ", y) fmt.Println("yのアドレス = ", &y) fmt.Println("指針変数pに格納された値 = ", p) //これは指針のアンラップリングです //指針の前に使用*演算子 //変数を介して値にアクセス //それが指している変数に fmt.Println("yに格納された値*p) = ", *p) }
出力:
yに格納された値 = 458 yのアドレス = 0xc0000120a8 指針変数pに格納された値 = 0xc0000120a8 yに格納された値*p) = 458
指針の値やメモリの場所を変更することもできますが、変数に新しい値を割り当てるのではなく。
package main import "fmt" func main() { //varキーワードを使用 //私たちは定義していません //変数の型を指定しません var y = 458 //指針変数を使用 // varキーワード、型を指定しません var p = &y fmt.Println("変更前、yに保存された値 = ", y) fmt.Println("yのアドレス = ", &y) fmt.Println("指針変数pに格納された値 = ", p) //これは指針のアンラップリングです //指針の前に使用*演算子 //変数を介して値にアクセス //それが指している変数に fmt.Println("変更前、y(に保存されます*p)に格納された値 = ", *p) //yの値を変更するために代入 //指針の新しい値 *p = 500 fmt.Println("変更後、y(に保存されます*p)に格納された値 = ", y) }
出力:
変更前、yに保存された値 = 458 yのアドレス = 0xc0000120a8 指針変数pに格納された値 = 0xc0000120a8 変更前、y(に保存されます*p)の値 = 458 変更後、y(に保存されます*p)の値 = 500