컴퓨터에서 변수 사용할때 가상메모리 하드웨어 메모리 구분지어서 매핑하는데 일단 이거 생략하고 설명해줄게.
어떤 지역변수 int a =0를 생성할때 메모리(스택영역)에 4바이트 메모리가 잡히게됨. 예를들어 메모리주소는 0x00이라 가정하면 해당 a변수의 주소는 0x00에서 0x04
사이에 할당되고 여기에 할당된 값은 0 이된다. 평소에는 그냥 int b = a; 로 간단히 사용하고 하는데 int b변수에 관한 메모리를 따로 잡고 거기에 대한 데이터를 a의 값을
복사해서 대입하는 식으로 돼.
위 방식이 call by value 그러니까 값에의한 호출로 다른 변수를 초기화 하게 됨.
근데 문제가 함수 파라미터 (int a, int b)식으로 받을 때 이게 지역변수가 되서 인자로 넘기는 변수 가 아닌 새로운 임시변수를 만들어서 대입하게됨.
메인 함수에서 function(a,b) 호출하고 function(int _a,int _b) {} 로 정의하면 인자로넘긴 a변수의 메모리와 _a의 메모리는 전혀 다른 공간에 쓰여지게 되지.
그래서 흔히 설명할때 swap(a,b) 를 예를들어서 실제로 안바뀌는 성질로 설명하는식으로 포인터를 설명하는거야. 메모리 접근의 필요함을 먼저 말해주고 포인터를
설명해주는거지.
여기서 우리는 value값이 아니라 실제 변수의 메모리위치를 가르키는 변수가 필요하다 라는 개념이 만들어낸게 포인터 변수야.
참
포인터변수는 value 값이 아니라 reference 그러니까 주소값을 가르키는거지.
그렇기때문에 간단히 사용하면 해당 메모리에 대해 접근해서 실제 값을 다른 함수에서도 바꿀수 있는거고 C++에서는 생성자 소멸자에서 포인터를 이용한
고급 테크닉으로 이용함. shared_ptr 같은게 실제 소스 까보면 포인터 이용해서 생성자 소멸자에서 메모리 해제해주는 방식으로 사용되게됨.
무튼 일반 변수는 메모리가 아닌 그 메모리에 쓰여저있는 값을 포인터변수는 그메모리 값을 참조해서 사용할수 있게해줌.
int *b = &a;
하면 b의 값자체는 a의 주소값을 가르키고
*b는 a의 주소번지에있는 데이터 0 이 표시되는거임
아직 초보라 내가 이해한건 포인터변수를 지정해주면 어느 함수에서든 쓸 수 있다는거야 ? 주소를 이용해서
ㅇㅇ 간단히 쓴다면 그렇지 근데 주소를 가르켜서 활용할수 있는 범위가 무궁무진해서 나중에 포인터 응용부분으로 들어가면 되게 신기한 테크닉들 많아.
포인터 변수를 통해 다른 변수를 받으면 다른 지역변수나 멤버변수에 접근이 가능하다 그거지
되서->돼서
쓰여지게->쓰이게