行列、文字列、ポインタ、参照#2


参照変数
  • 変数の別名のように使用できます.
  • 宣言
  • では初期化が必要です.int &ref = value
  • 初期化時に文字が聞こえない(例えば104).
    仏家:int &ref = 10
  • 定数は参照変数として使用できません.const int x = 5; const int &ref2 = x;
  • 参照変数の変更時に元の値を変更する例
    #include <iostream>
    
    int main()
    {
        using namespace std;
        
        int value1(5), value2(10);
        int &ref1(value1);
        
        cout << ref1 << endl;
        
        ref1 = value2;
        
        cout << ref1 << " " << value1 << endl;
        
        return 0;
    }
    5
    10 10
    参照とconst
  • 2constを使用して参照変数を宣言すると、テキストとして宣言できます.
  • この時の値も住所もあります.const int &ref_x = 3 + 4;
  • 参照値を関数パラメータの例として使用
  • 関数では、引数の値を変更することはできませんが、値に渡したくない場合はconstリファレンスを渡したほうがいいです.
  • const参照は、変数が参照によって変更されることを許さない参照である.
  • したがって、const参照をパラメータとして使用すると、呼び出し元保証関数にパラメータは変更されません.
  • void doSomething(const int &x)
    {
        cout << x << endl;
    }
    
    int main()
    {
        int a = 1;
        
        doSomething(a);
        doSomething(1);
        doSomething(a + 3);
        doSomething(3 * 4);
    
        return 0;
    }
    1
    1
    4
    12
    ポインタと参照のメンバーの選択
    構造体またはクラスに対して
  • ポインタおよび参照を使用する場合、ポインタおよび参照によって構造体またはクラスのメンバーにアクセスできます.
  • struct  Person
    {
        int age;
        double weight;
    };
    
    int main()
    {
        Person person;
        
        person.age = 5;
        person.weight = 30;
        
        Person &ref = person;
        ref.age = 15;
        ref.weight = 35;
        
        Person *ptr = &person;
        ptr->age = 30;
        (*ptr).weight = 50;
        
        Person &ref2 = *ptr;
        ref.age = 45;
        
        std::cout << &person << std::endl;
        std::cout << &ref2 << std::endl;
        
        return 0;
    }
    同じメモリアドレスを出力します.
    C++11 For-各繰り返し文
    動的に
  • 配列を割り当てる場合、for-each文は
  • を使用できません.
  • であるが、キャリアは
  • であることができる.
    int main()
    {
        int fibonacci[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
        
        //change array values =
        for(int number : fibonacci)
            number = 10;
        
        // output
        for(int number : fibonacci)
            cout << number << " ";
        cout << endl;
        
        
        //change array values
        for(auto &number : fibonacci)
            number *= 10;
        
        // output
        for(const auto &number : fibonacci)
            cout << number << " ";
        cout << endl;
        
        int max_number = 0;
        for(const auto &n : fibonacci)
            max_number = std::max(max_number, n);
        cout << max_number << endl;
        
        return 0;
    }
    0 1 1 2 3 5 8 13 21 34 55 89
    0 10 10 20 30 50 80 130 210 340 550 890
    890
  • 最初は配列内のすべての数字を10に変更しようとしましたが、配列を参照するのではなく、再コピーすることで配列を変更するので、出力時に元のメモリ内のFibonacci配列が出力されます.
  • 2番目の
  • は、Fibonacci配列のメモリアドレスを参照して値を変更するため、10倍の数字が現れる.
  • 第3は最大値を求めるライブラリを用いた.(algorithm max)
  • サウンドポインタ
  • アドレスは
  • 保存されています.
  • がどんなタイプなのか分からないので引用できません.
  • を再インポートするには、
  • を強制的に選択する必要があります.
    enum Type
    {
        INT,
        FLOAT,
        CHAR,
    };
    
    int main()
    {
        int     i = 5;
        float   f = 3.0;
        char    c = 'a';
        
        void *ptr = nullptr;
        
        ptr = &c;
        ptr = &i;
        ptr = &f;
        
        Type type = FLOAT;
        
        cout << &f << " " << ptr << endl;
        
        if(type == FLOAT)
            cout << *static_cast<float*>(ptr) << endl;
        else if(type == INT)
            cout << *static_cast<int*>(ptr) << endl;
        
        return 0;
    }
    
    マルチポインタ動的多次元配列
  • デュアルポインタ
  • の使用方法
  • をしない方法
  • int main() {
        using namespace std;
        int *ptr = nullptr;
        int **ptrptr = nullptr;
        
        int value = 5;
        
        ptr = &value;
        ptrptr = &ptr;
        
        cout << ptr << " " << *ptr << " " << &ptr << endl;
        cout << ptrptr << " " << *ptrptr << " " << &ptrptr << endl;
        cout << **ptrptr << endl;
        
        return 0;
    }
    -住所確認-
    0x7ffeefbff3d4 5 0x7ffeefbff3e0
    0x7ffeefbff3e0 0x7ffeefbff3d4 0x7ffeefbff3d8
    5
    2 Dマトリクスの実装例
  • git chap6_19 main.cpp
  • 参照
    std::arrayの概要
    使用例
    #include <iostream>
    #include <array>
    
    using namespace std;
    
    void printLength(const std::array<int, 5>& my_arr)
    {
        cout << my_arr.size() << endl;
    }
    
    int main()
    {
        //int array[] = { 1, 2, 3, 4, 5 };
        std::array<int, 5> my_arr = { 1, 2, 3, 4, 5 };
        
        //갯수가 적어도는 되지만 많으면 안됨
        my_arr = { 0, 1, 2, 3, 4};
        my_arr = { 0, 1, 2 };
        
        cout << my_arr[0] << endl;
        cout << my_arr.at(0) << endl;
        
        printLength(my_arr);
        
        return 0;
    } 
    ソート・アルゴリズムの使用例
    #include <iostream>
    #include <array>
    #include <algorithm>
    
    using namespace std;
    
    void printLength(const std::array<int, 5>& my_arr)
    {
        for (auto &element : my_arr)
            cout << element << " ";
        cout << endl;
    }
    
    int main()
    {
        //int array[] = { 1, 2, 3, 4, 5 };
        std::array<int, 5> my_arr = { 21, 2, 312, 40, 5 };
        
        printLength(my_arr);
        
        std::sort(my_arr.begin(), my_arr.end());
        
        printLength(my_arr);
        
        std::sort(my_arr.rbegin(), my_arr.rend());
        
        printLength(my_arr);
        
        return 0;
    }
    紹介する
  • ダイナミックアレイ
  • 自動消去メモリ
  • 使用例
    #include <iostream>
    #include <vector>
    
    int main()
    {
        using namespace std;
        // std::array<int, 5> array;
        std::vector<int> array;
        
        std::vector<int> array2 = { 1, 2, 3, 4, 5 };
        
        cout << array2.size() << endl;
        
        std::vector<int> array3 = { 1, 2, 3, };
        
        cout << array3.size() << endl;
        
        // uniform initialization
        std::vector<int> array4 { 1, 2, 3, };
        
        cout << array4.size() << endl;
        
        vector<int> arr = {1 ,2, 3, 4, 5 };
        arr.resize(10);
        
        for(auto &itr : arr)
            cout << itr << " ";
        cout << endl;
        
        cout << arr[1] << endl;
        cout << arr.at(1) << endl;
        
        return 0;
    }