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

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

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

    #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____

なるほどわからん