[C++/C] 変数とスコープ

void func();

int a = 0;

int main() {
    
    int b = 1;

    cout << "main関数ではa, bが使えます。\n";
    cout  << "変数aの値は" << a << "です。\n";
    cout  << "変数bの値は" << b << "です。\n";

    func();

    return 0; 
}

void func() {
    int c = 2;
    cout  << "変数cの値は" << c << "です。\n";
}

a++はローカル変数の加算で、::a++はグローバル変数の加算

### 記憶寿命
ローカル変数: 関数呼び出しの際にメモリが使われる
グローバル変数: プログラム終了時にメモリが解放される

void func();

int a = 0;

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

    return 0; 
}

void func() {
    int b = 0;
    static int c = 0;

    cout << "変数aは" << a << "変数bは" << b << "変数cは" << c << "です。\n";
    a++;
    b++;
    c++;
}

$ g++ -o sample sample.cpp && ./sample
変数aは0変数bは0変数cは0です。
変数aは1変数bは0変数cは1です。
変数aは2変数bは0変数cは2です。
変数aは3変数bは0変数cは3です。
変数aは4変数bは0変数cは4です。

staticをつけると、グローバル変数と同じ記憶寿命になる。

### 動的なメモリの確保(dynamic allocation)
ポインタ = new 型名;

int* pA;
pA = new int;

int main() {
    
    int* pA;
    pA = new int;

    cout << "動的にメモリを確保しました。\n";

    *pA = 10;

    cout << "動的に確保したメモリを使って" << *pA << "を出力しています。\n";

    delete pA;
    
    cout << "確保したメモリを解放しました。\n";

    return 0;
}

### 配列を動的に確保
pointerName = new 型名[要素数];
delete[] ポインタ名

int main() {
    
    int num;
    int* pT;

    cout << "何人のテストの点数を入力しますか?。\n";

    cin >> num;
    pT = new int[num];

    for(int i=0; i<num; i++){
        cin >> pT[i];
    }

    for(int j=0; j<num; j++){
        cout << j+1 << "番目の人の点数は" << pT[j] << "です。\n";
    }

    delete[] pT;

    return 0;
}

### ファイルの分割
myfunc.c

int max(int x, int y);

myfunc.cpp

int max(int x, int y){
    if (x > y)
        return x;
    else
        return y;
}
#include <iostream>
#include "myfunc.h"
using namespace std;

int main() {
    
    int num1, num2, ans;

    cout << "1番目の整数を入力してください。\n";
    cin >> num1;

    cout << "2番目の整数を入力してください。\n";
    cin >> num2;

    ans = max(num1, num2);

    cout << "最大値は" << ans << "です。\n";

    return 0;
}

$ g++ -o sample sample.cpp myfunc.cpp && ./sample

別ファイルのグローバル変数を使用したい場合はexternを使用する。

### practice
1. ●, 2. ●, 3.●, 4.×, 5.●

int main() {
    
    int* pA;
    pA = new int;
    *pA = 10;
    delete pA;

    return 0;
}