C とポインタ (9) リンクされたリストとポインタへのポインタ

リンク リスト
1. リンク リストは、データを含む独立したデータ構造の集合です。リンク リスト内の各ノードはポインタによって互いに接続されています。通常、ノードは動的に割り当てられます。
1) 単一リンク リストの各ノードには次のノードへのポインタが含まれており、リンク リストの最後のノードへのポインタは NULL です。
2) リンクされたリスト内のノードはメモリ内のさまざまな場所に分散されている可能性があり、必ずしも物理的に隣接している必要はありません。
3)単一リンクリストは、リンクリストの先頭ノードから末尾ノードまでリンクリストを横断することができるが、逆方向に横断することはできない。
4) 二重リンク リストには前のノードへのポインタと次のノードへのポインタが含まれており、リンク リストは両方向にトラバースできます。
5) 二重連結リストの先頭ノードの 2 つのポインタのうち、1 つは連結リストの最初のノードを指し、もう 1 つは最後のノードを指します。連結リストが空の場合、両方のポインタは NULL になります。

2. 単一リンク リストは、ポインタを使用して値を格納するデータ構造です。リンク リストの各ノードには、リンク リストの次のノードを指すフィールドが含まれています。さらに、リンク リストの最初のノードを指す独立したポインタがあります。ノードが作成されるとき、メモリを動的に割り当てる方法では、ノードは必ずしも物理的に隣接している必要はなく、リンク リストはポインタに従ってトラバースされ、単一リンク リストは一方向にしかトラバースできません。
3. ダブル リンク リストには 2 つのリンク フィールドが含まれており、1 つはリンク リストの次のノードを指し、もう 1 つはリンク リストの前のノードを指し、両方向にトラバースできます。

関数ポインタ
1. 配列宣言時に配列の長さを指定する必要がありますが、配列のリンク属性が外部の場合や関数の引数として使用されている場合、宣言時に長さを指定できない場合があります。
2. 関数ポインタは使用前に初期化する必要があります。初期化式中の & 演算子は省略可能です。コンパイラは暗黙的に関数名を関数ポインタに変換し、& 演算子はコンパイラに明示的に型変換を要求します。

3. コールバック関数。関数ポインタをパラメータとして他の関数に渡し、後者はこの関数をコールバックします。
1) 多くのウィンドウ システムはコールバック関数を使用して複数のアクションを接続します。
2) コンテキスト内でコールバック関数の正確な型を決定できない場合は、パラメーターの型を void* として宣言し、パラメーターをコールバック関数内で正しい型に変換できます。

4. 転送テーブルは関数ポインタの配列です。関数ポインタの配列を宣言して初期化する場合、初期化リスト内の関数名の順序は配列の添字の順序です。配列から正しい関数ポインタを選択し、関数呼び出し演算子は関数本体を実行します。

5. 関数ポインタ配列の添え字が範囲外であり、プログラムが 3 つの場所で終了する可能性があります:
1) まず、添え字の範囲外メモリがプログラムに割り当てられたメモリの外にある可能性があります。オペレーティング システムはこのエラーを検出し、プログラムが終了する場合、エラーレポートは添え字が範囲外の位置にありますが、一部のオペレーティングシステムではプログラムを終了しません; 2) プログラムは終了せず、不正に添え字が付けられたメモリの
値が抽出されます。値は有効なアドレスではない可能性があります。このとき、プログラムは終了し、エラー レポートのアドレスはランダムであるため、デバッグがより困難になります。3) 値がプログラム内の有効なアドレスである場合
、マシンは、不正な添え字に従って取得された仮想アドレスの命令を実行します。オペランド アドレスは終了します。4) 値は有効な命令を表す場合もあり、プログラムはランダム アドレスで命令を実行します。ランダム アドレスが発生した場合、関数内にある場合、関数を実行すると一部のデータが変更され、その結果未知の動作が発生し、関数が返される可能性があります。アドレスは別のランダムな値であり、コンピュータは各ランダムなアドレス間をジャンプし、命令はコール パスを破壊します。問題のデバッグはさらに困難になります。
5) 最初から、転送テーブルの添字が法定範囲内であることを確認する必要があります。

コマンド ライン パラメータ
1、コマンド ライン パラメータはポインタへのポインタである もう 1 つの便利な場所として、一部のシステムでは、ユーザーがコマンド ラインにパラメータを書き込んでプログラムを起動し、そのパラメータがプログラムに渡されます。

2. C の main 関数には 2 つの仮パラメータがあり、最初の argc はコマンド ライン パラメータの数を示し、2 番目の argv はパラメータ値のセットを指し、各要素はパラメータ テキストへのポインタを指します。
1) プログラムがコマンド ライン パラメーターにアクセスする必要がある場合、main 関数は宣言時にこれらのパラメーターを追加する必要があります。
2) argv のポインタ配列。各要素は文字ポインタ、配列の終端は NULL ポインタで、argv は文字へのポインタへのポインタとして宣言されます。
3) 一部のオペレーティング システムでは、環境変数と値のリストへのポインタである 3 番目のパラメータを main 関数に渡します。オペレーティング システムとコンパイラを参照します。

3. argv の最初のパラメータは通常、プログラムの名前です。プログラムは明らかにそれ自体の名前を知っており、このパラメータは通常は無視されます。
1) ただし、プログラムが複数の異なるオプションで開始される場合、このパラメータは無視できません。たとえば、UNIX システムでは、ディレクトリ内のすべてのファイルをリストするために使用されるプログラムは、名前 ls で始まるファイルの単純なリストを生成します。 、 l という名前で始まると、複数列の単純なリストが生成されます。 ll という名前で始まると、ファイルの詳細なリストが生成されます。プログラムは最初のパラメーターをチェックして、どの名前で始めるかを決定します。名前に従って開始オプションを選択します。
2) コマンド ライン パラメータ プログラム名の後に 0 個以上のオプションがあり、その後に 0 個以上のファイル名が続きます。オプション名は - で始まり、メイン プログラムがパラメータを処理します。

文字列定数
1。文字列定数は式に現れ、その値はポインタ定数です。コンパイラはこれらの指定された文字のコピーをメモリ内の特定の場所に保存し、最初の文字ポインタへのポインタを保存します。
1) 配列名が式で使用されている場合、その値はポインタ定数でもあります。

2. ポインタ定数に対して添字参照、間接アクセス、およびポインタ算術を実行できます。これらの演算子は、文字列定数に対して作用する場合、ポインタ定数に対する演算と同等です。
1) 文字列定数 + 添え字参照、間接アクセス、およびポインター算術式は有効です。

1を要約すると
、適切に宣言されていれば、ポインター変数は別のポインター変数を指すことができます。
1) ポインタへのポインタは使用前に初期化する必要があります。
2) ポインタ変数への二重間接アクセスを実行して、ターゲット オブジェクトを取得します もちろん、より多くの層の間接アクセスも許可されます。

2. 関数や配列へのポインタを作成したり、ポインタの配列を作成したりすることもできます。
1) 関数ポインタを使用してコールバック関数を実装します。コールバック関数へのポインタはパラメータとして別の関数に渡され、関数はこのポインタを使用してコールバック関数を呼び出します。この手法を使用すると、汎用関数を作成できます。コールバック関数は特殊な場合の作業を実行します。
2) 転送テーブルは関数ポインタの配列を使用します。関数は同じプロトタイプを持つ必要があります。添字を使用してポインタを選択し、ポインタを介して対応する関数を呼び出して、添字の値が境界を超えないようにします。

3. 実行環境がコマンド ライン パラメータを実装している場合、パラメータは 2 つの仮パラメータを通じて main 関数に渡されます。
1) argc はパラメータの数を表します。
2) argv は NULL ポインターで終わるポインター シーケンスを指し、各ポインターは文字シーケンス リストのコマンド ライン パラメーターを指します。最初のパラメーターはプログラム名であり、コマンド ライン パラメーターは argv 間接アクセス操作を通じて取得できます。

4. 式内の文字列定数の値は、文字列の最初の文字を指す定数ポインタです。配列名と同様に、文字列定数はポインタ式および添え字参照とともに使用できます。

おすすめ

転載: blog.csdn.net/mei_true/article/details/131395721