====== ポインタとメモリの基礎 ======
メモリを動的に取得=好きな時に好きなぐらいメモリを確保できるよ\\
今までは、
//型 配列変数名[配列数];
//配列数は定数限定
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;
}