知識ベース

参照解除演算子

間接 参照演算子または間接演算子は 、「*」(アスタリスクなど)で示されることもありますが、ポインター変数を含むCのような言語で見られる単項演算子(オペランドが1つの演算子)です。ポインター変数を操作し、ポインターアドレスの値に相当するl値を返します。これは、ポインターの「参照解除」と呼ばれます。たとえば、Cコード

int x; int * p; // *は宣言で使用されます。// pは整数へのポインタです。(参照解除後)// // pは整数x = 0; //現在x == 0 p =&x; //&はxのアドレスを取得します// p ==&xなので* p == 0、したがって* p == x * p = 1; // x = 1と同等、p ==&x //現在* p == 1およびx == 1

参照解除演算子と変数xへのポインターを使用して、変数xに 1を割り当てました。

構成

CおよびC ++で定義されている単項*演算子は、複数の間接参照が必要な場合に複数の間接参照が必要な場合の構成で使用できます。ポインターはもちろん他のポインターを参照できます。そのような場合、逆参照演算子の複数のアプリケーションが必要です。同様に、Javaドット演算子は、評価中に舞台裏でポインターの実質的な逆参照を必要とする非常に洗練されたステートメントを形成する構成で使用できます。

複数ポインターの間接指定の基本的な例は、C(およびC ++)のメイン関数へのargv引数です。これは、char ** argvとしてプロトタイプで指定されます。呼び出されたプログラム実行可能ファイルの名前と、それに続くすべてのコマンドライン引数は、独立した文字列として保存されます。 charへのポインターの配列には、これらの各文字列の最初の文字へのポインターが含まれ、このポインターの配列はargv引数としてメイン関数に渡されます。渡された配列自体はポインターに「減衰」します。したがって、argvはcharへのポインターの配列(同様に、配列内のポインターがそれぞれ単一のchar、実際には文字列を指します)。付随するメイン引数argcは、配列のサイズ(配列の要素が指す文字列の数)を提供します。これは、(最も外側の)配列のサイズは関数に渡されて変換されると失われるためです。ポインタへ。したがって、argvはcharへのポインターの配列の0番目の要素へのポインター* argvであり、これは** argvへのポインターです。文字(正確には、慣例により、最初の引数文字列の0番目の文字プログラムの名前)。

その他の構文

Cの祖先であるBCPLでは、同等の演算子は感嘆符を使用して表されていました。

Cでは、構造体(またはユニオン)のアドレスは&sで示されます。演算子&のアドレスは、参照解除演算子*の逆であるため、*&sはsと同等です。構造体(または共用体)のアドレスは、ポインターpに割り当てることができます。

p =&s; // sのアドレスがpに割り当てられています; p ==&s; // * pはsと同等です

構造体sのメンバーaの値は、saで示されます。sへのポインターpが与えられると(つまりp ==&s)、saは(* p).aと同等であり、またp-> aの略式です。ポインターを介して構造体(または共用体)のメンバーにアクセスするための構文糖:

p =&s; // sのアドレスがpに割り当てられています; p ==&s; // saは(* p).aと同等// saはp-> aと同等//(* p).aはp-> aと同等

->演算子は連鎖できます。たとえば、リンクリストでは、2番目の後続ノードのn-> next-> nextを参照できます(n-> nextがnullでない場合)。

UnixシェルスクリプトおよびMakefilesなどのユーティリティでは、ドル記号「$」は間接参照演算子であり、変数の名前をその内容に変換するために使用され、変数に割り当てるときに特に存在しません。

さまざまな言語で、識別子にはシギルと呼ばれるプレフィックスが使用されます。これらは単項演算子ではありません(構文的には識別子の一部であり、識別子のデータ型を示すなど、異なるセマンティクスを持ちます)が、逆参照演算子と構文的に類似しており、混乱する可能性があります。たとえば、シェルスクリプトでは$ FOOは変数FOOに適用される逆参照演算子$ですが、Perlでは$ fooはfooというスカラー変数です。 PHPでは、FOOは定数(ユーザー定義または組み込み)、$ FOOはFOOという名前の変数、$$ FOOはFOOという名前の変数に保存される変数です。