私はポインター、特に関数ポインターを理解するのに苦労しています。誰かがそれらが何であるか、プログラムでどのように使用する必要があるかを正確に要約してくれることを望んでいました. C++ のコード ブロックは特に高く評価されます。
ありがとうございました。
私はポインター、特に関数ポインターを理解するのに苦労しています。誰かがそれらが何であるか、プログラムでどのように使用する必要があるかを正確に要約してくれることを望んでいました. C++ のコード ブロックは特に高く評価されます。
ありがとうございました。
インダイレクションの概念を理解することは重要です。
ここでは、次のように値で渡しています (元のバージョンではなく、ローカル コピーが作成されて操作されることに注意してください) increment(x)
。
そして、ここでは、経由でポインタ(メモリアドレス)によってincrement(&x)
:
参照はポインタと同様に機能することに注意してください。ただし、構文は値のコピー ( obj.member
) と同様であり、ポインタは0
(「null」ポインタ) を指すことができますが、参照はゼロ以外のメモリ アドレスを指す必要があります。
一方、関数ポインターを使用すると、変数を渡すのと同じ方法で関数を簡単に渡したり処理したりできるため、実行時にコードの動作を動的に変更できます。ファンクターは、構文が簡潔であり、ローカル状態を関数インスタンスに関連付けることができるため、(特にSTLによって) 好まれることがよくあります (コールバックとクロージャーについて読んでください。どちらもコンピューター サイエンスの有用な概念です)。単純な関数ポインター/コールバックの場合、コンパクトでインプレース構文のため、ラムダがよく使用されます ( C++11の新機能)。
ポインタはポイントを指し、そのポイントのアドレスを持つ整数値です。ポインターは他のポインターを指すことができます。次に、より間接的な方法で値を取得できます。
参照演算子 (&): ポインターを変数またはポインターの参照と同等にすることができます。
逆参照演算子 (*): ポインターが指すセルの値を取得できます。
参照ではなく関数に渡されると、配列はポインターに分解されます。
関数ポインターはインライン化されておらず、プログラムをより機能的にします。コールバックはこれの例です。
例えとして、コンピューターのメモリを Excel シートと考えてください。C/C++ プログラムで変数に値を代入するのと同じことは、Excel シートのセルに何かを書き込むことです。変数からの読み取りは、セルの内容を見るようなものです。
ここで、コンテンツが「B8」であるセル (C3 など) がある場合、そのコンテンツを別のセルへの参照として解釈できます。セル C3 をそのように扱うと、C3 はポインタのようになります。=B8
(Excel では、 C3に入ることで実際にこの動作を実現できます)。
このようなシナリオでは、基本的に、関心のある値を持つセルが C3 で参照されていると述べます。C++ では、これは次のようになります。
int B8 = 42;
int* C3 = &B8;
これで、メモリを占有する 2 つの変数ができました。ここで、C3 が何を指しているか知りたい場合は、
int my_value = *C3;
関数ポインタに関しては、これらは通常のポインタのような変数ですが、それらが指すアドレス (セル) は単なる値ではなく、呼び出すことができる関数です。
ここでは、関数ポインターの使用例をいくつか見つけることができます: http://www.cprogramming.com/tutorial/function-pointers.html
ポインタを理解するには、ハードウェアとメモリ レイアウトについて少し理解する必要があります。
コンピュータのメモリは、引き出し付きの食器棚と見なすことができます。ドロワー内を見ているポインター、つまり「ドロワー」に格納されている値を「逆参照」すると、ポインターは任意のドロワーを指すことができます。
e.g. ten numbers stored after one another
short a[] = {9,2,3,4,5,6,7,8,1,-1] ;
in memory the values that consist the array 'a' are stored sequentially
+---+---+---+---+---+---+---+---+---+---+
a->| 9 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | -1|
+---+---+---+---+---+---+---+---+---+---+
the 'a' array above is a pointer and is the start address where the
values are stored in memory.
short* ptr = 0; // a pointer not pointing to anything (NULL)
ptr = a + 5; // the pointer is now pointing to the 6th value in the array
// the + 5 is an offset on the starting address of a and since the type of
// a is short int array the compiler calculates the correct byte offset based
// on that type. in the above example 5 is 5 short ints since ptr is of type
// short*
*ptr has the value 6 i.e. we are looking at what the ptr is pointing to.
各「ドロワー」のサイズは、格納されるデータ型によって決まります。上記の例では、10 個の short int が格納されます。すべての short int が 2 バイトを占有するため、配列全体が 20 バイトのメモリ (sizeof(a)) を占有します。