配列、ポインタ、参照変数


🔑整列


配列は、インデックスを識別子に追加し、隣接するメモリの場所に配置する同じタイプの要素です.個別に参照できます.
type name[elements];
type name[]={constructor1,2,,,,,}
ex)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>

using namespace std;;

class Unit {
private: 
	int x, y;
public:
	Unit(int a) {
		x = a; y = a;
	}

	void Print() {
		cout << x << "," << y << "\n";
	}
};

int main() {
	Unit aUnit[2] = { Unit(1),Unit(2) };

	for (int i = 0; i < 2; i++) {
		cout << "aUnit[" << i << "]=";
		aUnit[1].Print();
	}

	return 0;
}

🔑ししん


•ポインタは、コンピュータメモリに格納されている他の変数(またはオブジェクト)のアドレスを直接参照(または「ポイント」)する変数です.
•デフォルトのデータ型では、演算子「」が使用されます.
•オブジェクトポインタは、演算子「->」および「」を使用してオブジェクトにアクセスできます.
ex)
#include <iostream>

using namespace std;

class Unit {
private:
	int x, y;

public:
	Unit(int a, int b) {
		x = a; y = b;
	}

	void Print() {
		cout << x << "," << y << "\n";
	}
};

int main() {
	Unit aUnit[2] = { Unit(1,2),Unit(3,4) };
	int i;
	Unit* pUnit = aUnit;//배열은 첫번째 주소의 주솟값만 담고 있으므로 포인터로 쓸 수 있음

	cout << "Using '->' operator \n";
	for (i = 0; i < 2; i++) {
		pUnit->Print();
		pUnit++;
	}

	pUnit = aUnit;

	cout << "Using '.' operator \n";
	for (i = 0; i < 2; i++) {
		(*pUnit).Print();
		pUnit++;
	}
}
結果:
Using '->' operator
1,2
3,4
Using '.' operator
1,2
3,4
同じ意味の文は違う方法で書くことができます.

このポインタ


•C++のすべてのオブジェクトは、このポインタと呼ばれる重要なポインタでアドレスにアクセスできます.
•このポインタは、すべてのメンバー関数のデフォルトパラメータです.

このポインタテスト



#include <iostream>


using namespace std;

class Unit {
private:
	int x, y;

public:
	Unit* p;

	Unit(int x, int y, Unit* p) : x(x), y(y), p(p) {}


	void Print() {

	cout << this->x << ", " << this->y << endl;
	if (!p) return;
	this->p->Print();


	}
};

int main() {
	Unit c(5, 6, NULL);
	Unit b(3, 4, &c);
	Unit a(1, 2, &b);

	cout << "[print a]" << endl; a.Print();
	cout << "[Print b]" << endl; b.Print();
	cout << "[Print c]" << endl; c.Print();

	return 0;

}
結果:
[print a]
1, 2
3, 4
5, 6
[Print b]
3, 4
5, 6
[Print c]
5, 6
a.print()のthisは&aで、
&a->pは&bで、
&b->print()はb.print()を表すので、連続的に出力できます.

🔑New, Delete


ダイナミックメモリ割り当て(<>静的メモリ割り当て)
•実行中にメモリをインスタントに割り当てる
•コンパイラは、正確な容量やアイテム数を事前に知る必要はありません.
•new演算子は、メモリを使用してオブジェクトを作成し、割り当てられたメモリアドレスを含むポインタを返します.
出典:https://boycoding.tistory.com/204[ジュニアコード]
data_type data = new data_type;
data_type data = new data_type[elements];
class_type object = new class_type();
class_type objectA = new class_type[elements] class_type *objectB = new class_type[elements]{class_type(),…, class_type()};
delete data;
delete[ ] dataA;
delete object;
delete[] objectA;
delete[] objectB;
int plnteger = new int;
int plntegerA = new int[10];
Unit pUnit = new Unit(1,2);
Unit pUnitA = new Unit[2];
Unit* pUnitB = new Unit[2]{Unit(1,2),Unit(3,4)};
delete plnteger;
delete[ ] plntegerA;
delete pUnit;
delete[ ] pUnitA;
delete[ ] pUnitB;
ex1)
#include <iostream>

using namespace std;
class Unit {
	int x, y;
public:
	Unit(int x, int y) : x(x), y(y) {}
	void Print() {
		cout << x << "," << y << "\n";
	}
};



	
int main() {
	int* pInteger = NULL;
	pInteger = new int;

	if (!pInteger) {
		cout << "Allocation Fail\n";
		return -1;
	}

	*pInteger = 777;
	cout << "pInteger = " << pInteger << " *pInteger = " << *pInteger << "\n";

	delete pInteger;

	Unit* pUnit = new Unit(1, 2);
	pUnit->Print();
	delete pUnit;

}
結果:
pInteger = 000001B0AD4360C0 *pInteger = 777
1,2

New,Deleteテスト


#include <iostream>

using namespace std;
class Unit {
	int x, y;
public:
	Unit() : x(1), y(1) {}
	Unit(int x, int y) : x(x), y(y) {}
	void Print() {
		cout << x << "," << y << "\n";
	}
};




int main() {

	Unit* pUnit = new Unit[2];

	pUnit[0] = Unit(1, 2);
	pUnit[1] = Unit(3, 4);
	for (int i = 0; i < 2; i++) {
		pUnit[i].Print();
	}



}

🔑リファレンス変数


•参照により、プログラマは、変数に格納されている元のデータの読み取りまたは変更に使用できる変数の2番目の使用可能な名前を作成できます.
•参照を作成した後で他のオブジェクトを参照することはできません.
type &name;
int A=5;
int &rA = A;
すなわち,参照型変数の働き方は参照値と同じである.住所じゃない!

call-by-value, call-by-reference


call-by-valueとcall-by-referenceをよく説明した文章があります.
#include <iostream>
using namespace std;

void swap(int x, int y) {
	int t;
	t = x;
	x = y;
	y = t;
}

void pointerSwap(int *x, int *y) {
	int t;
	t = *x;
	*x =*y;
	*y = t;
}

int main() {
	int i = 4;
	int j = 7;
	cout << "i: " << i << " j : "<< j << endl;
	swap(i, j);
	cout << "i: " << i << " j : " << j << endl;

	cout << "i: " << i << " j : " << j << endl;
	pointerSwap(&i, &j);
	cout << "i: " << i << " j : " << j << endl;

}
結果:
i: 4 j : 7
i: 4 j : 7
i: 4 j : 7
i: 7 j : 4
simplevalueを参照するswapは新しいメモリを割り当て、4,7という値しか取得しないため、swap関数のx,yは変化したが、実際のmainでは変化しなかった.
逆にpointerSwapの場合、x、yの主な切り上げを受け入れ、主な切り上げに対応する値を変更するのでmain関数に適用されます.

リファレンスswapの使用

void referenceSwap(int& x, int& y) {
	int t;
	t = x;
	x = y;
	y = t;

}
ポインタで交換するように交換します.

🔑整列ポインタテスト


#include <iostream>
#include <vector>
using namespace std;

int FindMaxNumber(vector<int> argGrade) {
	int size = argGrade.size();
	int max = argGrade[0];
	int maxIndex = 0;
	for (int i = 0; i < size; i++) {
		if (argGrade[i] > max) {
			max = argGrade[i];
			maxIndex = i;
		}
	}
	return maxIndex;
}

void main() {
	vector<int> aGrade = { 90,88,85,55,47,92,87,30,89,65 };
	int maxGradeIndex = 0;

	maxGradeIndex = FindMaxNumber(aGrade);

	cout << "Best Grade = " << aGrade[maxGradeIndex] << "\n";
	cout << "StudentID= " << maxGradeIndex + 1 << "\n";
}
動的配列をパラメータとする関数をVectorコンテナを用いて記述した.
Vectorとsizeof(ARR)/sizeof(int)が使用できない理由