LoginSignup
1
2

More than 5 years have passed since last update.

C++のポインターとリファレンスの定義の記述確認用コード

Last updated at Posted at 2015-09-15

記述の一貫性が全く掴めないので自分用まとめ。後で表組みはしたい

コンパイルが通る記述で有ることを確認するためのコード

#include <cstdio>

class CClass {
    public:
        int i;
        int ai[3];
        void F() {
            printf("## F\n");
            printf("- i:%d\n", i);
            printf("- ai:%p\n", ai);
            printf("- *ai:%d\n", *ai);
            printf("- ai[0]:%d\n", ai[0]);
            printf("- ai[1]:%d\n", ai[1]);
            printf("- ai[2]:%d\n", ai[2]);
        }
};

int main() {
    // 変数
    printf("____VARIABLE_BEGIN____\n");
    int i = 1; // iへ1を代入
    int j = i; // iの値(1)をjへコピー
    int &rk = i; // iのリファレンスrkを定義
    int *pi = &i; // ポインターpiへiのアドレスを代入

    printf("- i: %d\n", i);
    printf("- j: %d\n", j);
    printf("- rk: %d\n", rk);
    printf("- pi: %p\n", pi);
    printf("- *pi: %d\n", *pi);

    printf("# ++i: %d\n", ++i);
    printf("- i: %d\n", i);
    printf("- j: %d\n", j);
    printf("- rk: %d\n", rk);
    printf("- pi: %p\n", pi);
    printf("- *pi: %d\n", *pi);

    printf("# --j: %d\n", --j);
    printf("- i: %d\n", i);
    printf("- j: %d\n", j);
    printf("- rk: %d\n", rk);
    printf("- pi: %p\n", pi);
    printf("- *pi: %d\n", *pi);

    printf("# ++rk: %d\n", ++rk);
    printf("- i: %d\n", i);
    printf("- j: %d\n", j);
    printf("- rk: %d\n", rk);
    printf("- pi: %p\n", pi);
    printf("- *pi: %d\n", *pi);

    printf("# ++*pi: %d\n", ++*pi);
    printf("- i: %d\n", i);
    printf("- j: %d\n", j);
    printf("- rk: %d\n", rk);
    printf("- pi: %p\n", pi);
    printf("- *pi: %d\n", *pi);

    printf("____VARIABLE_END____\n");

    // 配列
    printf("____ARRAY_BEGIN____\n");
    int ai[3]; // 配列ai[3]を定義
    int *pai = ai; // 配列aiの先頭のアドレスをポインターpaiへ代入
    int (&rai)[3] = ai; // 配列aiのアドレスをリファレンスrai[3]へ代入

    ai[0] = 1000;
    ai[1] = 2000;
    ai[2] = 3000;

    printf("# ai[0] = 1001: %d\n", ai[0] = 1001);
    printf("- ai: %p\n", ai);
    printf("- ai[0]: %d\n", ai[0]);
    printf("- ai[1]: %d\n", ai[1]);
    printf("- ai[2]: %d\n", ai[2]);
    printf("- pai: %p\n", pai);
    printf("- *pai: %d\n", *pai);
    printf("- rai: %p\n", rai);
    printf("- rai[0]: %d\n", rai[0]);
    printf("- *rai: %d\n", *rai);

    printf("# ai[1] = 2001: %d\n", ai[1] = 2001);
    printf("- ai: %p\n", ai);
    printf("- ai[0]: %d\n", ai[0]);
    printf("- ai[1]: %d\n", ai[1]);
    printf("- ai[2]: %d\n", ai[2]);
    printf("- pai: %p\n", pai);
    printf("- *pai: %d\n", *pai);
    printf("- rai: %p\n", rai);
    printf("- rai[0]: %d\n", rai[0]);
    printf("- *rai: %d\n", *rai);

    printf("# ++pai: %p\n", ++pai);
    printf("- ai: %p\n", ai);
    printf("- ai[0]: %d\n", ai[0]);
    printf("- ai[1]: %d\n", ai[1]);
    printf("- ai[2]: %d\n", ai[2]);
    printf("- pai: %p\n", pai);
    printf("- *pai: %d\n", *pai);
    printf("- rai: %p\n", rai);
    printf("- rai[0]: %d\n", rai[0]);
    printf("- *rai: %d\n", *rai);

    printf("____ARRAY_END____\n");

    // クラス
    printf("____CLASS_BEGIN____\n");
    int CClass:: *pj = &CClass:: i; // クラスメンバー変数へのポインター*pjへクラスメンバー変数iの(相対)アドレスを代入
    void (CClass:: *pf)() = &CClass:: F; // クラスメンバー関数へのポインター*pfへクラスメンバー関数Fの(相対)アドレスを代入

    CClass c; // クラス生成
    CClass *pc = &c; // クラスポインター*pcへcのアドレスを代入

    c.i = 1;
    c.ai[0] = 100;
    c.ai[1] = 200;
    c.ai[2] = 300;

    printf("# c.i = 1: %d\n", c.i = 1); // 直接メンバー変数へ代入
    c.F(); // 直接メンバー関数を呼ぶ
    printf("# c.*pj = 2: %d\n", c.*pj = 2); // 直接メンバー変数ポインターへ代入
    (c.*pf)(); // 直接メンバー関数ポインターを呼ぶ

    printf("# (*pc).i = 3: %d\n", (*pc).i = 3); // クラスポインター経由でメンバー変数へ代入
    (*pc).F(); // クラスポインター経由でメンバー関数を呼ぶ
    printf("# *pc.*pj = 4: %d\n", *pc.*pj = 4); // クラスポインター経由でメンバー変数ポインターへ代入
    (*pc.*pf)(); // クラスポインター経由でメンバー関数ポインターを呼ぶ

    printf("# pc->i = 5: %d\n", pc->i = 5); // クラスアドレス経由でメンバー変数へ代入
    pc->F(); // クラスアドレス経由でメンバー関数を呼ぶ
    printf("# pc->*pj = 6: %d\n", pc->*pj = 6); // クラスアドレス経由でメンバー変数ポインターへ代入
    (pc->*pf)(); // クラスアドレス経由でメンバー関数ポインターを呼ぶ

    printf("____CLASS_END____\n");

    return 0;
}

実行結果

____VARIABLE_BEGIN____
- i: 1
- j: 1
- rk: 1
- pi: 0x7fff509c7864
- *pi: 1
# ++i: 2
- i: 2
- j: 1
- rk: 2
- pi: 0x7fff509c7864
- *pi: 2
# --j: 0
- i: 2
- j: 0
- rk: 2
- pi: 0x7fff509c7864
- *pi: 2
# ++rk: 3
- i: 3
- j: 0
- rk: 3
- pi: 0x7fff509c7864
- *pi: 3
# ++*pi: 4
- i: 4
- j: 0
- rk: 4
- pi: 0x7fff509c7864
- *pi: 4
____VARIABLE_END____
____ARRAY_BEGIN____
# ai[0] = 1001: 1001
- ai: 0x7fff509c786c
- ai[0]: 1001
- ai[1]: 2000
- ai[2]: 3000
- pai: 0x7fff509c786c
- *pai: 1001
- rai: 0x7fff509c786c
- rai[0]: 1001
- *rai: 1001
# ai[1] = 2001: 2001
- ai: 0x7fff509c786c
- ai[0]: 1001
- ai[1]: 2001
- ai[2]: 3000
- pai: 0x7fff509c786c
- *pai: 1001
- rai: 0x7fff509c786c
- rai[0]: 1001
- *rai: 1001
# ++pai: 0x7fff509c7870
- ai: 0x7fff509c786c
- ai[0]: 1001
- ai[1]: 2001
- ai[2]: 3000
- pai: 0x7fff509c7870
- *pai: 2001
- rai: 0x7fff509c786c
- rai[0]: 1001
- *rai: 1001
____ARRAY_END____
____CLASS_BEGIN____
# c.i = 1: 1
## F
- i:1
- ai:0x7fff509c781c
- *ai:100
- ai[0]:100
- ai[1]:200
- ai[2]:300
# c.*pj = 2: 2
## F
- i:2
- ai:0x7fff509c781c
- *ai:100
- ai[0]:100
- ai[1]:200
- ai[2]:300
# (*pc).i = 3: 3
## F
- i:3
- ai:0x7fff509c781c
- *ai:100
- ai[0]:100
- ai[1]:200
- ai[2]:300
# *pc.*pj = 4: 4
## F
- i:4
- ai:0x7fff509c781c
- *ai:100
- ai[0]:100
- ai[1]:200
- ai[2]:300
# pc->i = 5: 5
## F
- i:5
- ai:0x7fff509c781c
- *ai:100
- ai[0]:100
- ai[1]:200
- ai[2]:300
# pc->*pj = 6: 6
## F
- i:6
- ai:0x7fff509c781c
- *ai:100
- ai[0]:100
- ai[1]:200
- ai[2]:300
____CLASS_END____

なるほどわからん

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2