ポインタとメモリの基礎

メモリを動的に取得=好きな時に好きなぐらいメモリを確保できるよ
今までは、

//型 配列変数名[配列数];
//配列数は定数限定
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で配列数を宣言していたところで、結局コンパイルしなおし🤮

今回やる、メモリの動的確保を使うことでこんなことができるよ。

Listing. 1: 配列の動的確保
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…

授業でやったプログラム

Listing. 2: ポインタとメモリの基礎
"theMain.cpp"
#include <iostream>
#include <cstdio>
 
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;
}