[C++/C] ポインタ

アドレスは16進数を使ってx01000, 0x1004などで表す
メモリのアドレスは&変数名を使う

int main() {
    
    int a;
    a = 5;

    cout << "変数aの値は" << a << "です。\n";
    cout << "変数aのアドレスは" << &a << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレスは0xffffc948bd84です。

### ポインタ
アドレスを格納する特殊な変数

int main() {
    
    int a;
    int* pA;

    a = 5;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";
    cout << "変数aのアドレス(&a)は" << &a << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレス(&a)は0xffffe5f9f30cです。
ポインタpAの値は0xffffe5f9f30cです。

ポインタから変数の値を知るには *pAとする

int main() {
    
    int a;
    int* pA;

    a = 5;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";
    cout << "変数aのアドレス(&a)は" << &a << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";
    cout << "*pAの値は" << *pA << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレス(&a)は0xffffc90c856cです。
ポインタpAの値は0xffffc90c856cです。
*pAの値は5です。

### ポインタに別のアドレスを代入する

int main() {
    
    int a = 5;
    int b = 10;
    int* pA;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";
    cout << "*pAの値は" << *pA << "です。\n";

    pA = &b;
    
    cout << "変数bの値は" << b << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";
    cout << "*pAの値は" << *pA << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
ポインタpAの値は0xffffd6b96088です。
*pAの値は5です。
変数bの値は10です。
ポインタpAの値は0xffffd6b9608cです。
*pAの値は10です。

### ポインタを使って変数を変更する

int main() {
    
    int a = 5;
    int* pA;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";

    *pA = 50;
    
    cout << "*pAに50を代入しました。\n";
    cout << "aの値は" << a << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
*pAに50を代入しました。
aの値は50です。

なぜこのような機能があるか??

### 引数とポインタ
swapの誤ったコード

void swap(int x, int y);

int main() {
    
    int num1 = 5;
    int num2 = 10;

    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    cout << "変数num1とnum2の値を交換します。\n";

    swap(num1, num2);
    
    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    return 0; 
}

void swap(int x, int y){
    int tmp;

    tmp = x;
    x = y;
    y = tmp;
}

$ g++ -o sample sample.cpp && ./sample
変数num1の値は5です。
変数num2の値は10です。
変数num1とnum2の値を交換します。
変数num1の値は5です。
変数num2の値は10です。

通常の値渡しでは、実引数を変更することができない。

アドレスを引数にすると、変更することができる。

void swap(int* x, int* y);

int main() {
    
    int num1 = 5;
    int num2 = 10;

    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    cout << "変数num1とnum2の値を交換します。\n";

    swap(&num1, &num2);
    
    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    return 0; 
}

void swap(int* px, int* py){
    int tmp;

    tmp = *px;
    *px = *py;
    *py = tmp;
}

$ g++ -o sample sample.cpp && ./sample
変数num1の値は5です。
変数num2の値は10です。
変数num1とnum2の値を交換します。
変数num1の値は10です。
変数num2の値は5です。