====== ポインタとメモリの基礎 ====== メモリを動的に取得=好きな時に好きなぐらいメモリを確保できるよ\\ 今までは、 //型 配列変数名[配列数]; //配列数は定数限定 int arr[10]; int arr2[5] = {1, 2, 3, 4, 5}; } とか宣言していました。\\ 仕様変更などで、配列数が変わるとコンパイルしなおさなきゃない。。。\\ よーしそれなら。\\ const int ARR_NUM=10; const int ARR2_NUM=5; int arr[ARR_NUM]; int arr2[ARR2_NUM] = {1, 2, 3, 4, 5}; } たとえ、const intで配列数を宣言していたところで、結局コンパイルしなおし🤮\\ 今回やる、メモリの動的確保を使うことでこんなことができるよ。\\ 配列の動的確保 int main() { int arrnum; printf("配列数を入力:"); cin >> arrnum; int* arr = nullptr; arr = new int[arrnum]; printf("%d個のデータを入力してください\n", arrnum); for (int i = 0; i < arrnum; i++) { printf("%2d個目のデータ:", i + 1); cin >> arr[i]; } for (int i = 0; i < arrnum; i++) { printf("arr[%2d] = %2d\n", i, arr[i]); } return 0; } これで、好きな時に好きな数の配列を準備することができます\\ (vector使えるみんなにとってはあまり重要じゃないかもね。vectorのない時間軸ではとても重要なことだったんだよ)\\ ==== 組み込み型(int,float,charなど)の動的確保 ==== Under Constructing...\\ ==== 自作型(class,struct)の動的確保 ==== コンストラクタとデストラクタの話も書くよ\\ Under Constructing...\\ ==== 動的確保したメモリの開放 ==== Under Constructing...\\ ==== 動的確保したメモリの開放(配列の時) ==== Under Constructing...\\ ===== 授業でやったプログラム ===== ポインタとメモリの基礎 #include #include using std::cin; using std::cout; using std::endl; struct pos { int x; int y; }; class Hebi { pos Pos; public: Hebi(){} ~Hebi(){} void SetPos(int x, int y) { Pos.x = x; Pos.y = y; } void PrintPos() { printf("Pos(%2d,%2d)\n", Pos.x, Pos.y); } }; int main() { ////int a[10]; //int a = 10; //double b = 20.4; //printf("a=%5d addr=%p\n", a, &a); //printf("b=%5.2lf addr=%p\n", b, &b); //int* pa = nullptr;//アドレスのゼロ //double* pb = nullptr;//アドレスのゼロ //printf("new 前\n"); //printf("pa=%p\n", pa); ////new 型 で空いている領域に 型分のデータを入れる領域を確保する ////newはアドレスを返す! //pa = new int; //*pa = 10; //printf("new 後\n"); //printf("pa=%p *pa=%5d\n", pa, *pa);//*はポインタの指すアドレスの中身を見るよ ////int 5個分の領域を空いているメモリ領域に見つけて、そのアドレスを返す ////[変数]ができる=好きな時に好きな大きさの配列を作れるよ //pa = new int[5];//同じポインタ変数を使っているので、元のメモリが宙ぶらりんになってる(怖い) //pa[0] = 1; //pa[1] = 2; //pa[2] = 3; //pa[3] = 4; //pa[4] = 10; //for (int i = 0; i < 5; i++) //{ // printf("pa[%2d]=%2d\n", i, pa[i]);//[]は指定した、アドレスの中身を見るよ //} pos position = { 3,5 }; //position.x = 3; //position.y = 5; Hebi snake; snake.SetPos(3, 5); snake.PrintPos(); pos* pPos = nullptr; pPos = new pos; (*pPos).x = 10; (*pPos).y = 5; printf("%p::pos(%2d,%2d)\n", pPos, (*pPos).x, (*pPos).y); pPos->x = 11; pPos->y = 6; printf("%p::pos(%2d,%2d)\n", pPos, pPos->x, pPos->y);//アロー演算子 //クラスの時はどうなるかな? // pPos = new pos[5]; //これはどうやってアクセスする? //後片付けはどうやるんだろう。。。 delete delete [] return 0; }