『Objective-Cプログラミング』9.アドレスとポインタ

3861 ワード

アドレスとポインタ
  • 1バイト(byte)=8ビット(bit)
  • メモリには数値番号があり、通常はアドレス(address)で特定のバイトのデータを指す.
  • 32ビットCPUまたは64ビットCPUは、実はアドレスの大きさを指す.一方、64ビットCPUは32ビットCPUよりもアドレッシング能力が高い.

  • アドレスの取得
  • 変数のアドレス:メモリのある場所を指し、その位置のメモリに変数の値が保存されている.&演算子により、変数のアドレスが得られる.
  • %pは、メモリアドレスのフォーマット説明子である.
  • 通常、メモリアドレスは16進数で出力されます.
  • int i = 17;
    printf("i stores its value at %p
    ",&i);

    出力結果:
    i stores its value at 0x7fff5fbff79c
  • プログラムがコンピュータ上で実行されると、関連するすべてのデータがメモリに保存され、それぞれのアドレスがあります.
  • 関数にも独自のアドレスがあります.関数の関数名によって、対応する関数のアドレスが得られます.
  • printf("this function starts at %p
    ",main);

    出力結果:
    this function starts at 0x100000d10
    ししん
  • ポインタは、特定のタイプの変数でメモリアドレスを保存します.
  • ポインタの意味:プログラムは必ずしもコピーによってデータを伝達できるとは限らないが、データの開始アドレスを直接伝達したりコピーによって伝達したりすることができるに違いない.データの先頭アドレスがあれば、対応するデータに容易にアクセスできる.
  • ポインタの宣言方式:例NSString *a;
  • は、*演算子を使用して、あるアドレスに保存されたデータにアクセスすることができる.
  • 演算子の役割:
  • 宣言ポインタ;
  • 参照:ポインタによってアドレス内のデータにアクセスします.
  • 指定されたアドレスにデータを保存する.

  • int i = 17;
    // *    ,   addressOfI   int *,     int      
    int *addressOfI = &i;
    printf("i stores its value at %p
    ",addressOfI); // * addressOfI int printf("the int stored at addressOfI is %d
    ",*addressOfI); // * , *addressOfI = 89; printf("Now i is %d
    ",i);

    出力結果
    i stores its value at 0x7fff5fbff79c
    the int stored at addressOfI is 17
    Now i is 89
    異なるタイプのデータに使用されるバイトサイズ
  • sizeof()は、あるデータ型のサイズを得ることができる.
  • sizeof()はsizeというタイプを返します.tの数、それに対応するフォーマット説明子は:%zu;
  • //   sizeof()              
    printf("An char is %zu bytes
    ",sizeof(char)); printf("An short is %zu bytes
    ",sizeof(short)); printf("An int is %zu bytes
    ",sizeof(int)); printf("An long is %zu bytes
    ",sizeof(long)); printf("An float is %zu bytes
    ",sizeof(float)); printf("An double is %zu bytes
    ",sizeof(double)); printf("A pointer is %zu bytes
    ",sizeof(int *)); // sizeof() , printf("An int is %zu bytes
    ",sizeof(i)); printf("A pointer is %zu bytes
    ",sizeof(addressOfI));

    出力結果:
    An char is 1 bytes
    An short is 2 bytes
    An int is 4 bytes
    An long is 8 bytes
    An float is 4 bytes
    An double is 8 bytes
    A pointer is 8 bytes
    An int is 4 bytes
    A pointer is 8 bytes
    このプログラムを実行するプロセッサ(CPU)のビット数は、ポインタの占有バイトサイズを見て逆方向に判断することができる.ポインタの長さが4バイトの場合、プログラムを実行するプロセッサは32ビットである.ポインタの長さが8バイトの場合、プロセッサは64ビットです.
  • の範囲で、保存できる最小数と最大数
  • データ型
    ビット数
    さいしょうすう
    最大数
    char
    8ビット
    -128
    127
    Unsigned char
    8ビット
    0
    255
    short
    16ビット
    -32768
    32767
    Unsigned short
    16ビット
    0
    65535

    NULL
  • 「空」ポインタ:場合によっては、アドレスを保存できるポインタ変数が必要ですが、ポインタがアドレスを指していないことを明確に示す値を割り当てます.C言語のNULLはここの「ある値」である.
  • NULLは0です.
  • は、NULLがここでは空の値であることを示す場合がある.
  • nilおよびNULLは等しいが、Objective-Cのプログラマーは、通常、このアドレスにオブジェクトがないことを表すためにnilを使用する.

  • ifの条件式では、ポインタが空かどうかを判断します.
        float *myPointer;
        if (myPointer) {
            // myPointer    ,  myPointer != NULL
            printf("myPointer    NULL.
    "); }else { printf("myPointer NULL.
    "); } // if (myPointer != NULL) { printf("myPointer NULL.
    "); }else { printf("myPointer NULL.
    "); }

    出力結果:
    **myPointer**はNULLです.
    **myPointer**はNULLです.