本質:
参照はエイリアスで、ポインタはアドレスです
具体的:
1. 現象的に言えば、ポインターは実行時に指す値を変更できますが、参照はオブジェクトにバインドされると変更されません。この文は、次のように理解できます。ポインタは、別のオブジェクトを指すように再割り当てできます。ただし、参照は常に初期化中に指定されたオブジェクトを指し、後で変更することはできませんが、指定されたオブジェクトの内容は変更できます。
2. メモリ割り当ての観点から見ると、プログラムはポインタ変数にメモリ領域を割り当てますが、参照には割り当てません。これは、参照が既存のオブジェクトを指すように宣言されたときに初期化する必要があるためです。参照は null 値を指すことはできません。
3. コンパイルの観点から見ると、プログラムはコンパイル中にシンボル テーブルへのポインタと参照をそれぞれ追加し、シンボル テーブルには変数名と変数に対応するアドレスが記録されます。シンボルテーブルのポインタ変数に対応するアドレス値がポインタ変数のアドレス値であり、シンボルテーブルの参照に対応するアドレス値が参照先のアドレス値である。
シンボルテーブルは生成後に変更されないため、ポインタは指すオブジェクトを変更できます(ポインタ変数の値は変更できます)が、参照オブジェクトは変更できません。これが、ポインターの使用が安全ではなく、参照の使用が安全である主な理由です。ある意味、参照は変更できないポインタと考えることができます。
4. null 値への参照がないという事実は、参照を使用するコードがポインターを使用するよりも効率的であることを意味します。参照を使用する前にその有効性をテストする必要がないためです。対照的に、ポインタは null にならないように常にテストする必要があります。
5. 理論上、ポインター レベルの数に制限はありませんが、参照できるのは 1 レベルのみです。次のようになります:
int** p1; // 合法。指向指针的指针 int*& p2; // 合法。指向指针的引用 int&* p3; // 非法。指向引用的指针是非法的 int&& p4; // 非法。指向引用的引用是非法的
注意!上記の読み方は左から右です。
推奨チュートリアル: PHP ビデオ チュートリアル
以上がPHP参照とポインタの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。