配列とポインタ | Q's software

配列とポインタ

C 言語のポインタを理解する の応用編。配列とポインタの関係について説明します。配列とポインタの関係です。難しい話はなく、2 つのことを覚えれば十分です。
  • ポインタアクセスと配列アクセス
      要素が 10 個ある配列に値を代入するとき、

        int *ap;
        ap = malloc(10);

        // パターン1
        for (int i = 0; i < 10; i++) {
        *(ap + i) = i;
        }

        // パターン2
        for (int i = 0; i < 10; i++) {
        ap[i] = i;
        }
      パターン1,2 は全て結果が同じになります。
      ポインタアクセスと配列アクセス
      配列の N 番目にアクセスしたいときは、
      • ポインタアクセス
          *(ap + N)
      • 配列アクセス
          ap[N]

      と覚えれば問題ありません。使う場合は、だいたいの場合で好みでどちらかに統一されていくと思いますが、他人が書いたソースコードを読む場合に必要になるかもしれません。

  • ポインタ変数の演算

      ポインタ変数の演算は、ポインタ変数の実体となる型の大きさによって結果が異なるようになります。

        char a;
        short b;
        long c;

        char *ap;
        short *bp;
        long *cp;

        a = 1;
        b = 1;
        c = 1;
        ap = (char*)1;
        bp = (short*)1;
        cp = (long*)1;

        printf("a + 1 = %d \n, a+1);
        printf("b + 1 = %d \n, b+1);
        printf("c + 1 = %d \n, c+1);
        printf("ap + 1 = %d \n, (int)(ap+1));
        printf("bp + 1 = %d \n, (int)(bp+1));
        printf("cp + 1 = %d \n, (int)(cp+1));
      とすると実行結果は、

        a + 1 = 2;
        b + 1 = 2;
        c + 1 = 2;
        ap + 1 = 2;
        bp + 1 = 3;
        cp + 1 = 5;

      となり、ポインタ型の演算は、どの型のポインタかによって計算される量がかわります。
      なので void* p; という形では動いたりもしますが、通常は使いません。

まとめると、

    ポインタ型の演算は、どの型のポインタかによって計算される量がかわり

      variable *p;
      p++;
      p += 4;
    は、書き換えると

      variable *p;
      (unsinged int)p = (unsigned int)p + sizeof(variable);
      (unsinged int)p = ((unsigned int)p + sizeof(variable) * 4);

    となるということです。
    人気ブログランキングへ ← 読んだらプチっとお願いします。