C++

C++でポインタ初歩の初歩

More than 3 years have passed since last update.

概要

C++をやってみると、やはりポインタに慣れることは必須科目でしょう。
私は遠い昔、大学の授業でC言語やったときの記憶しかございません。
ということで、主に自分の備忘録用として、
int型の変数、配列、構造体の3つについて、ポインタを使ったサンプルを書いてみました。

ちなみに余談ですが、コード中で使用している「int iValue」といった、
変数のデータ型を名称の接頭辞に付与する記法を「ハンガリアン記法」というらしいです。
へー
そして、時代遅れという記事も見かけましたw

確かに普段自分も書かない。
(だって今更C++を初歩から調べてみても、参考サイトが古い記事ばっかなんだもん・・・)

1.変数のポインタ

pointer.cpp
#include <iostream>

int main(){

    // 普通のint型変数
    int  iValue;

    // iValueのポインタ(変数のアドレス)
    int* piValue = &iValue;

    std::cout << piValue;
    std::cout << "\n";

    // ポインタを使ってiValueに書き込む
    *piValue = 10;

    std::cout << iValue;
    std::cout << "\n";

    return 0;
}

コンパイル&実行

$ g++ -o pointer pointer.cpp 
$ ./pointer 
0x7fff1ab9bd14
10

2.配列のポインタ

/**
 * 配列のポインタ
 */
int main(){

    // 配列の宣言
    int aiArr[] = {10, 20, 30, 40, 50};

    // aiArrのポインタ(下記は同意)
//    int *paiArr = &(aiArr[0]);
    int *paiArr = aiArr;

    for(int i = 0; i < 5; i++){

        // ポインタの値
        std::cout << paiArr + i;
        std::cout << ":";
        // ポインタを使って配列の値を参照
        std::cout << *(paiArr + i);
        std::cout << "\n";
    }

    return 0;
}

コンパイル&実行

$ g++ -o pointer2 pointer2.cpp 
$ ./pointer2
0x7fffa9516b70:10
0x7fffa9516b74:20
0x7fffa9516b78:30
0x7fffa9516b7c:40
0x7fffa9516b80:50

3.構造体のポインタ

メモ:
構造体のポインタは「->」でメンバ参照する

/**
 * 構造体のポインタ
 */
int main(){

    struct employee {
        int  id;
        const char* name;
    };

    struct employee emp = {100, "Taro"};
    struct employee *pemp = &emp;

    /* 普通に構造体を参照 */
    std::cout << emp.id;
    std::cout << ":";
    std::cout << emp.name;
    std::cout << "\n";

    /* ポインタを使った参照 */
    std::cout << pemp->id;
    std::cout << ":";
    std::cout << pemp->name;
    std::cout << "\n";

    /* 構造体のメンバのポインタ */
    int *pid = &emp.id;
    std::cout << *pid;
    std::cout << "\n";
}

コンパイル&実行

$ g++ -o pointer3 pointer3.cpp 
$ ./pointer3 
100:Taro
100:Taro
100