#include <string>
#include <iostream>
using namespace std;
int main()
{
/**
자연스럽게 써야 하는 문법적 요소
1. 포인터 Pointer
2. 참조자 Reference
3. 상수 Constant
4. 동적 할당 Dynamic Memory Allocation : new연산자로 객체 생성하고
delete 연산자로 메모리에서 객체 해제 합니다.
5. 스마트 포인터 Smarter Pointer
unique_ptr : 객체의 유일한 소유권을 가지는 스마트 포인터
shared_ptr : 객체간의 공유가 가능한 스마트 포인터
weak_ptr : shared_ptr의 순환참조 문제를 해결한 약한 참조의 스마트 포인터
*/
// 포인터란
// 주소를 저장하는 변수입니다
// 일반적인 변수는 데이터를 저장하는데 반하여 포인터는 메모리(Ram) 공간의 주소를 저장한다.
// 포인터 변수가 주소를 저장하려면 변수의 주소를 알아야 하는데
// 1. 변수 이름 앞에 &(주소연산자)를 붙이면 해당 변수의 시작 주소를 반환한다.
// 변수이름 앞에 &연산자를 붙이면 해당 변수의 주소를 반환한다. // x
// 2. 포인터 변수가 저장하는 변수의 주소에 저장된 값을 참조하려면 *(역참조 연산자)를 사용한다.
// int포인터 타입의 intPtr1이라는 이름의 포인터 변수를 선언한다.
// nullprt값을 intPtr1이라는 포인터 변수에 대입함으로써 초기화를 한다.
int* intPtr1 = nullptr;
int intValue1 = 10;
/** intValue1변수의 주소값을 intPtr1포인터 변수에 대입했습니다. */
intPtr1 = &intValue1;
// 주소값은 16진수로 표시된다. RAM의 주소값이므로 컴퓨터마다 다르다
// intValue1변수의 주소값
cout << "intValue1 address : " << &intValue1 << endl; // 내가 살고 있는 집 주소
// intPtr1 포인터 변수의 값
cout << "intPtr1 : " << intPtr1 << endl; // 내가 살고 있는 집 주소
// intPtr1 포인터 변수의 주소 값
cout << "intPtr1 address : " << &intPtr1 << endl; // 내가 살고 있는 아파트 주소
// intPtr1 포인터 변수가 가리키는 값
// 포인터 변수에 역참조 연산자(*)를 붙여주면 포인터 변수가 가리키는 실제 값을 알 수 있다.
cout << "intPtr1 value : " << *intPtr1 << endl;
cout << endl;
cout << endl;
// 포인터와 배열의 관계
// int타입을 여러개 저장할 수 있는 배열타입으로 intArr1이라는 배열변수를 선언한다.
// 10, 20, 30, 40, 50 의 값을 intArr1 배열에 대입함으로써 초기화를 한다.
// 1. 변수 이름 앞에 &(주소연산자)를 붙이면 해당 변수의 시작 주소를 반환한다.
// 변수이름 앞에 &연산자를 붙이면 해당 변수의 주소를 반환한다. // x
int intArr1[] = { 10,20,30,40,50 };
cout << "intArr1[0] address : " << intArr1 << endl;
cout << "intArr1[0] address : " << &intArr1[0] << endl;
cout << "intArr1[1] address : " << intArr1 + 1 << endl;
cout << "intArr1[1] address : " << &intArr1[1] << endl;
cout << "intArr1[0] value : " << *intArr1 << endl;
cout << "intArr1[0] value : " << intArr1[0] << endl;
cout << "intArr1[1] value : " << *(intArr1 + 1) << endl;
cout << "intArr1[1] value : " << intArr1[1] << endl;
cout << endl;
cout << endl;
}
Unreal PointerStudy