ホームページ > バックエンド開発 > Golang > golang はポインタの向きを変更します

golang はポインタの向きを変更します

WBOY
リリース: 2023-05-14 16:54:37
オリジナル
790 人が閲覧しました

Golang は、効率的でスケーラブルで学習が容易なオープンソース プログラミング言語で、ネットワーク アプリケーション、分散システム、クラウド コンピューティング、人工知能などの分野で広く使用されています。

Golang では、ポインタは非常に一般的なデータ型であり、変数のアドレスをメモリに保存するために使用され、プログラムが変数の値に直接アクセスして変更できるようになります。 Golang のポインターは、& 演算子を使用して変数のアドレスを取得し、* 演算子を使用して変数の値に間接的にアクセスできます。

ただし、場合によっては、プログラムの実行中にポインターのポインターを変更する必要がある場合があります。つまり、ある変数のアドレスから別の変数のアドレスに変更する必要があるかもしれません。これは通常、動的に割り当てられたメモリまたはデータ構造の操作を伴うプログラムで発生します。この記事では、Golang でポインタの向きを変更する方法を説明します。

ポインターの割り当て

最初に、ポインターを使用して変数の値を変更する方法を示す簡単な例を見てみましょう。

1

2

3

4

5

6

7

8

9

10

11

12

13

package main

   

import "fmt"

   

func main() {

    var a int = 10        // 声明一个变量a,并初始化为10

    var p *int           // 声明一个整型指针p

   

    p = &a               // 将指针p指向变量a的地址

    *p = 20              // 通过指针p,修改a的值为20

   

    fmt.Println("a = ", a) // 输出a的值,结果为20

}

ログイン後にコピー

上記のコードでは、整数変数 a を宣言し、それを 10 に初期化します。同時に、整数を指すポインタ p が宣言され、& 演算子によって変数 a のアドレスを指します。次に、*p を使用してポインター p が指す変数の値を取得し、それを 20 に変更して、変数 a の値を変更します。

ポインターのリダイレクト

上記の例では、ポインター p を通じて変数 a の値を変更しましたが、ポインター p 自体のポインターは変更しませんでした。ここで、ポインターが別の変数のアドレスを指すようにリダイレクトする方法を見てみましょう。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package main

   

import "fmt"

   

func main() {

    var a int = 10        // 声明一个变量a,并初始化为10

    var b int = 20        // 声明一个变量b,并初始化为20

    var p *int           // 声明一个整型指针p

   

    p = &a               // 将指针p指向变量a的地址

    p = &b               // 将指针p重定向为变量b的地址

   

    fmt.Println("a = ", a) // 输出a的值,结果为10

    fmt.Println("b = ", b) // 输出b的值,结果为20

    fmt.Println("*p = ", *p) // 输出*p所指向变量的值,结果为20

}

ログイン後にコピー

上記のコードでは、2 つの整数変数 a と b を宣言し、それぞれ 10 と 20 に初期化します。同時に、整数を指すポインタ p が宣言されます。次に、&p を使用してポインタ p が変数 a のアドレスを指し、それを変数 b のアドレスにリダイレクトします。

a と b の値を出力すると、それらの値は変化していないことがわかり、*p を通じて変数 b の値 (20) にアクセスできます。

ポインタの交換

ポインタの交換とは、変数値を交換するという目的を達成するために、2 つのポインタが指す変数のアドレスを交換することを指します。このセクションでは、ポインタ交換を実装する 2 つの方法を紹介します。

方法 1: 一時変数を使用した交換

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

package main

   

import "fmt"

   

func swap(a, b *int) {

    var temp int        // 定义一个临时变量temp

    temp = *a

    *a = *b

    *b = temp

}

   

func main() {

    var a int = 10        // 声明一个变量a,并初始化为10

    var b int = 20        // 声明一个变量b,并初始化为20

    var p1 *int = &a      // 声明一个指向变量a的指针p1

    var p2 *int = &b      // 声明一个指向变量b的指针p2

   

    swap(p1, p2)          // 交换指针p1和p2所指向变量的值

   

    fmt.Println("a = ", a) // 输出a的值,结果为20

    fmt.Println("b = ", b) // 输出b的值,结果为10

}

ログイン後にコピー

上記のコードでは、int 型への 2 つのポインターを受け入れる swap 関数を定義します。この関数では、ポインタの 1 つが指す変数の値を格納する一時変数 temp を定義します。次に、ポインタを介して変数の値を交換し、最終的にポインタの交換を実現します。

方法 2: ポインターからポインターへのスワップ

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

package main

   

import "fmt"

   

func swap(a **int, b **int) {

    var temp *int        

    temp = *a

    *a = *b

    *b = temp

}

   

func main() {

    var a int = 10        // 声明一个变量a,并初始化为10

    var b int = 20        // 声明一个变量b,并初始化为20

    var p1 *int = &a      // 声明一个指向变量a的指针p1

    var p2 *int = &b      // 声明一个指向变量b的指针p2

   

    swap(&p1, &p2)        // 交换指针p1和p2的指向

   

    fmt.Println("a = ", a) // 输出a的值,结果为20

    fmt.Println("b = ", b) // 输出b的值,结果为10

}

ログイン後にコピー

上記のコードでは、2 つのポインターからポインターを受け入れるようにスワップ関数のシグネチャを変更しました。このように、swap関数では、この2つのポインタの指向性を交換することができ、ポインタの交換を実現します。

まとめ

この記事では主にGolangでポインタの向きを変更する方法を紹介します。この記事の説明を通じて、ポインタを使用して変数の値を変更する方法、ポインタをリダイレクトする方法、およびポインタが指す変数の値を交換する方法を理解できます。

ポインターの使用を誤ると、プログラムのクラッシュやデータの破損が発生する可能性があるため、ポインターを使用するときは十分に注意する必要があります。したがって、コードを注意深く読み、常に注意してポインターを使用する必要があります。

以上がgolang はポインタの向きを変更しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート