ポインタ


コンピュータプログラミングの基本概念の一つは変数である.あなたが一般的に計算機科学、またはプログラミングを勉強している場合、チャンスはあなたが変数とは何か知っている.簡単に言えば

A variable is a container which holds a value


変数は、特定のデータ型の値を保持することができますint , char , float , bool ポインターは特別な種類の変数に過ぎません.値を格納するのではなく、変数のアドレスを格納します.
この用語のすべてが意味をなさなかった場合、我々はこれに深く掘ります.
コンピュータは主に2つのタイプの記憶、プライマリメモリとセカンダリメモリから成ります.そして、我々がプログラムを実行するときはいつでも、それで宣言された変数の全てはプライマリメモリA . K . Aに記憶されます.現在、変数はRAMのどこにでもありえます、しかし、どのように我々は彼らを見つけることができましたか?
あなたの家に仲間の1つを招待したいと思いますが、彼は前にあなたの家を訪問したことがないし、どのように彼はそれを見つけるだろうか?彼は住所が必要だ.アドレスで彼は正確にあなたの家を見つけることができます.しかし、1つを除いて、彼はあなたの家を見つけるまで全世界を歩き回る必要があります.それは楽しい仕事のように聞こえない.できますか.
同様に、プライマリメモリに格納されるすべての変数には、特定のアドレスが割り当てられます.別の変数は、同じアドレスに存在することはできません.同じように、あなたの家とあなたの友人の家のアドレスは、同じ家に住んでいない限り同じことができません.
今すぐあなたの友人にあなたのアドレスを送信する必要があります.どうやってやるの?あなたのアドレスを含むあなたの友人にテキストメッセージを送信しましょう.あなたの友人はそれを受け取り、あなたの場所にアドレスを見つけ、彼の方法を作ることによって来る.
彼のステップをたどりましょう、最初に、彼はあなたのアドレスを明らかにするテキストメッセージを受け取ります、そして、彼はあなたの家を見つけるために特定のアドレスを見つけます.これはポインタの例です.テキストメッセージがあなたの家のアドレスを含んでいるように、ポインタは変数のアドレスを含んでいます.それは変数の実際の値を含んでいません.あなたのテキストメッセージがあなたの家全体を含んでいるならば、想像してください.テキストメッセージが実際の家への参照を含んでいるので、ポインタは実際の変数へのリファレンスを含んでいます.ポインタを参照すると、参照される変数の値が表示されます.

コードを話しましょう👨‍💻

  • C言語では、ポインタは*<pointer_var_name> ライクint *p;
  • ポインタのデータ型は、格納されている変数のデータ型と同じです.整数値を格納している変数を参照するポインタが整数値である場合、ポインタは整数ポインターになります.変数が文字を格納している場合、ポインタは文字ポインタと呼ばれます.
  • 例えば
    int a = 5;
    int *ip = &a;  // '&' is called the "address of" operator, and the '*' is known as "dereference" operator Here, the address of a is fetched and stored inside ip
    
    char c = 'c';
    char *cp = &c;
    
    コードに深く掘りましょう.最初の例では、仮定しましょうa がメモリ位置に格納される100 . a 価値がある5 and ip のアドレスを含むa . したがって、技術的に価値ip は100です.デリフェレンシングipa5 .

    ポインタは別のポインタのアドレスを保持することもできます.二重ポインタと呼ばれる
    int a = 5;
    int *ip = &a;  // ip holds the address of a
    int **pp = &p;  // pp holds the address of p, which holds the address of a
    
    上の例では、ip 一度a . として直接a , しかし、pp 値を取得するにはa 2回のデリファレンスを行う必要があります.asppip and ipa .

    この方法では、ポインタを一緒に連鎖することができます.

    ポインタは遅いです!🐌


    プログラムを実行するたびに、その中で宣言されたすべての変数がRAMにあるプログラムスタックフレームに格納されます.今、計算中、CPUはRAMから内部レジスタに変数をフェッチします.このメモリアクセスは、世界最速のものではありません.このプロセスは数ナノ秒を要する.したがって、変数に直接アクセスする場合、CPUはメモリから一度だけ変数をフェッチする必要があります.しかし、ポインタの場合、複数の旅行は、CPUから値を得るためにRAMに必要です.単一ポインタの場合、最初に変数のアドレスがフェッチされ、それから再び値変数がその特定のメモリアドレスからフェッチされる.ダブルポインタの場合、変数の値を取得する前に、RAMに3回の旅行を行います.したがって、長さが長いほど、変数を取得する時間がかかります.
    前のシナリオを取りましょう.あなたの家に直接のアドレスを提供する代わりに、あなたの友人はあなたの地元の食料品店のアドレス、あなたの最寄りの鉄道駅へのアドレスを彼に手を渡し、そこに誰かが彼にあなたの家に住所を与える、これは確かに彼はあなたの家に直接アドレスを与えられた場合、より長い時間がかかるでしょう.
    それはすべての人々は、この記事は、ポインタに向かって“まだ別の”視点を与える願っています.ポインタは、多くの初心者プログラマによってしばしば誤解されます.その基礎に分解されるとき、彼らは本当に単純で、把握するのが簡単です.