int a = 10;
cout << "a: " << a << endl;
cout << "&a: " << &a << endl;
포인터 선언
*(에스크리터)
-> 포인터 선언은 자료형과 변수명 사이에 *를 추가한다.
포인터 변수의 초기화
int a = 10;
int* ptr = &a;
다음과 같이 포인터를 선언하게 될 경우 쓰레기 값이 초기화가 되버린다.
int* ptr;
쓰레기 값 초기화란 -> ptr이라는 변수에 쓰레기 값으로 초기화가 진행된다. -> 초기화된 값을 주소로 읽으면 어디를 가리킬지 모르는 상황이 발생한다. -> 만약, 해당 주소가 운영체제를 가동하는데 중요한 위치를 가리킨다면? -> 그리고 그 값을 사용자가 변경한다면, 운영체제에 큰 문제가 발생할 가능성이 생긴다. -> 단, 요즘의 운영체제는 할당받지 않은 메모리 접근의 시도가 있을 경우 -> 이를 감지하면 해당 프로그램을 강제로 종료시켜버린다고 한다.
포인터 변수를 초기화 할 때 값을 0으로 넣게되면 결과는 000000000 이런식으로 나오게 된다.
이것은 0번지 주소를 의미하는 것이 아니고, 아무런 곳도 가리키고 있지 않다는 의미이다.
그런데 만약 포인터 변수 초기화 값이 일반 변수의 초기화 값과 같다면 햇갈리는 경우가 생길 수가 있어,
이를 방지하기 위해 C++에는 nullptr이라는 것이 존재한다.
int* ptr1 = 0;
int* ptr2 = nullptr;
역참조 연산자
-> 포인터 변수 선언 시 사용한 *는 에스크리터이다.
-> 포인터 변수 선언 후 사용한 *는 역참조 연산자이다.
-> 변수명 앞에 역참조 연산자를 붙여주면, 해당 변수가 가지고 있는 주소로 찾아가 값을 확인해주는 역할을 수행한다.
역참조 연산자를 통해 원본 데이터에 접근하여 읽을 수 있다.
int a = 10;
int* ptr = &a;
cout << a << endl; // 결과 : 10
cout << &a << endl; // 결과 : 주소값
cout << ptr << endl; // 결과 : 주소값
cout << *ptr << endl; // 결과 : 10
포인터의 크기
-> 어떤 자료형이든 4byte의 크기를 가진다.
-> 개발 환경을 살펴보니 32bit 개발환경이다.
-> 32bit 운영체제에서 가용할 수 있는 메모리의 크기는 4GB이다.
-> 포인터는 1byte당 하나의 주소가 할당되니 4GB를 byte단위로 변화하면 약 42억 9천만개의 주소 개수가 나온다.
-> 각 주소를 저장하기 위해서 필요한 크기는 최대 4byte의 공간만 있으면 저장이 가능하다.