ホームページ >バックエンド開発 >Golang >ポインタの逆参照は Go でどのように機能しますか? C/C との比較はどうですか?

ポインタの逆参照は Go でどのように機能しますか? C/C との比較はどうですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-10 07:01:13141ブラウズ

How Does Pointer Dereferencing Work in Go, and How Does It Compare to C/C  ?

Go におけるポインタの逆参照について

Go の基本的な操作であるポインタの逆参照には、ポインタ変数が指す値へのアクセスが含まれます。質問で言及されている例では、カスタム構造体 Vertex を操作するためにポインターが使用されています。

ポインターと構造体

元の例では、Vertex インスタンスの作成を紹介しました。ポインタを使用した Vertex インスタンスへの参照が含まれます。変更された例では、次の処理が行われます。

t := *q
q.X = 4

最初の行は、ポインター q を逆参照し、その基になる値を t に代入し、実質的に指す頂点のコピーを作成します。その後、q.X を変更すると、元の Vertex インスタンスが更新されますが、t は構造体の別のコピーを保持するため、t には影響しません。

ポインターによるサプライズの回避

変更を確実に行うにはポインタを介して作成された内容は他の参照に反映されるため、ポインタは一貫して使用する必要があります。以下の修正された例では、t と q の両方が同じ基礎となる Vertex を指します:

t := q

この変更により、q.X = 4 は t と q の両方によってアクセスされる Vertex インスタンスを更新し、期待される出力が得られます。 :

{1 2} &{4 2} {1 0} {0 0} &{4 2} {4 2} true

C/C の並列

「非常に奇妙な動作」という認識に反して、C/C はポインタが関係する場合に同様の動作を示します。次の C コードは、これを示しています。

Vertex v = Vertex{1, 2};
Vertex* q = &v;
Vertex t = *q;
q->x = 4;
std::cout << "*q: " << *q << "\n";
std::cout << " t: " << t << "\n";

出力は、変更された Go の例に似ています。

*q: { 4, 2 }
t: { 1, 2 }

したがって、Go で観察されるポインター逆参照の動作は、ポインターの動作と一致しています。 C/C などの他のプログラミング言語

以上がポインタの逆参照は Go でどのように機能しますか? C/C との比較はどうですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。