私の非常に個人的な意見では、矢印がこの方向を指している写真や、ポインタが理解しづらくなる写真です。それはそれらをいくつかの抽象的な神秘的な実体のように見せます。ではない。
コンピューターの他のすべてと同様に、ポインターは数値です。「ポインタ」という名前は、「アドレスを含む変数」と言っただけの派手な方法です。
したがって、コンピュータが実際にどのように機能するかを説明することによって、物事をかき回してみましょう。
int
名前i
と値5 を持つがあります。これはメモリに保存されます。メモリに保存されているすべてのものと同様に、アドレスが必要です。そうでないと、アドレスを見つけることができません。たとえばi
、アドレス0x12345678でj
終わり、値6のバディがその直後にあるとします。intが4バイトでポインタが4バイトである32ビットCPUを想定すると、変数は次のように物理メモリに格納されます。
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
次に、これらの変数を示します。int 、、int* ip1
およびへのポインタを1つ作成しますint* ip2
。コンピュータ内のすべてのものと同様に、これらのポインタ変数もメモリ内のどこかに割り当てられます。それらがメモリ内の次の隣接するアドレスに到達するとすぐに考えてみましょうj
。以前に割り当てられた変数のアドレスを含むようにポインターを設定しますip1=&i;
:(「iのアドレスをip1にコピー」)およびip2=&j
。線の間で何が起こるか:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
したがって、取得されたのは、数値を含むメモリの4バイトのチャンクです。どこにも神秘的な魔法の矢はありません。
実際、メモリダンプを見ただけでは、アドレス0x12345680にint
またはが含まれているかどうかはわかりませんint*
。違いは、プログラムがこのアドレスに格納されているコンテンツを使用する方法を選択することです。(私たちのプログラムのタスクは、実際には、これらの数値をどうするかをCPUに伝えることです。)
次に、さらに別のレベルの間接参照をで追加しint** ipp = &ip1;
ます。ここでも、メモリのチャンクを取得します。
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
パターンはおなじみのようです。数値を含むさらに4バイトのチャンク。
さて、上記の架空の小さなRAMのメモリダンプがある場合、これらのポインタが指す場所を手動で確認できます。ipp
変数のアドレスに格納されているものをのぞいて、内容0x12345680を見つけます。もちろんどちらがip1
格納されているアドレスです。そのアドレスに行って内容を確認し、のアドレスを見つけてi
、最後にそのアドレスに行って番号5を見つけることができます。
したがって、ippの内容を*ipp
取得すると、ポインタ変数のアドレスが取得されますip1
。書き込むことによって*ipp=ip2
、我々はIP1にIP2をコピーし、それは同等ですip1=ip2
。どちらの場合でも、
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(これらの例は、ビッグエンディアンCPUに対して与えられました)
ipp
定義するときにのタイプを追加してください。質問が完了します;-)