#include <iostream>

using namespace std;

int main() {
	//new 연산자
	/*
	어떤 데이터형을 원하는지 new 연산자에게 알려주면,
	new 연사자는 그에 알맞은 크기의 메모리 블록을
	찾아내고 그 블록의 주소를 리턴한다.
	*/

	//첫 번째 방법
	int a;
	int* b = &a;
	// b를 통해서도 a를통해서도 둘다 접근할 수 있다.

	//두 번째 방법
	int* pointer = new int;
	//포인터 변수 하나만 인트형 값에 접근할 수 있는 유일한 방법

	//new 는 int를 보고 몇 바이트가 필요한지 알아낸다 (4바이트)
	//그걸 찾아내서 pointer 변수에 초기화 해준다.
	//pointer가 데이터의 객체를 지시하고있다 고 표현할 수 있다.

}
#include <iostream>

using namespace std;

int main() {

	//delete 연산자
	/*
	사용한 메모리를 다시 메모리 풀로 환수
	환수된 메모리는 프로그램의 다른 부분이 다시 사용
	*/

	int* ps = new int;
	//메모리 사용
	delete ps;
	//new 를사용하고 delete를 사용해줘야한다.
	//하지않는다면 메모리 누수가 발생할 수 있음.

	/*
	1. new로 대입하지 않은 메모리는 delete로 해제할 수 없다.
	2. 같은 메모리 블록을 연달아 두 번 delete로 해제할 수 없다.
	3. new[] 메모리를 대입할 경우 delete[]로 해제한다.
	4. 대괄호를 사용하지 않았다면 delete도 대괄호를 사용하지 않아야 한다.
	*/
}
#include <iostream>

using namespace std;

int main() {

	double* p3 = new double[3];			//double형 데이터 3개를 저장할 수 있는 공간을 대입한다.
	p3[0] = 0.2;				//p3를 배열 이름처럼 취급한다.
	p3[1] = 0.5;
	p3[2] = 0.8;

	cout << "p3[1] is " << p3[1] << endl;

	p3 = p3 + 1;				//포인터를 증가시킨다.
								//+1은 더블형 데이터 공간 한개로 인지된다.
								//그래서 p[0]은 전의 p[1]값을 가르키게 된다. 흠..왜? 이렇게 쓸까

	cout << "Now p3[0] is " << p3[0] << " and ";
	cout << "p3[1] is " << p3[1] << endl;

	p3 = p3 - 1;				//다시 시작 위치를 지시한다.
	delete[] p3;				//배열 메모리를 해제한다.
	//cin.get();

}