C++ 포인터는 2가지만 알면된다


1. * 참조 연산자

2. & 주소 연산자


포인터는 다른 변수의 위치를 가르키는 변수이다.


예를들어

int a = 10 이라는 변수가 선언되었다.

여기서 a는 
자료형 int
크기 4바이트
형태 정수형
값이 10인
주소의 이름이 a이다.

그럼 주소의 이름이 a면 주소의 값은?
& 주소 연산자를 통해 끌어낼 수 있다.

int a = 10
int* pa = &a

자료형 int
크기 4바이트
형태 정수형
값이 10인
주소의 이름이 a인 변수 a를 선언한후

자료형이 int 포인터 인 pa를 선언해서 
&a <- a의 주소를 넣어 준다.
그럼 pa는 a의 주소값을 가진 변수가 되는것이다.

아 int 포인터의 크기는 
32비트 환경에서는 4바이트
64비트 환경에서는 8바이트이다.

그럼 포인터는 주소를 가르키는 변수인데 증명을 하고 싶으면.
아래와 같은 방법으로 증명 할 수 있다.

int a = 10;
int b = 20;

int* pa = &a;
int* pb = &b;

printf_s("%d\n", pa);
printf_s("%d\n", pb);

이와 같은 코드를 실행 했을때

7731072
7731060

라는 실행결과를 얻을수있다.(메모리의 할당은 자동으로 할당되는것이기때문에 주소값은 실행시 바뀐다.)
pa와 pb의 주소값의 차이가 12바이트가 차이가나는데. 

그럼 pb의 값을 + 12 해서 새로운 pc라는 포인터에 넣어주면
pc는 a를 가르키는 포인터가 되어야한다.
아래의 코드를 보자

int a = 10;
int b = 20;

int* pa = &a;
int* pb = &b;

printf_s("pa  : %d\n", pa);
printf_s("pb  : %d\n", pb);
printf_s("*pa : %d\n", *pa);
printf_s("*pb : %d\n", *pb);

int* pc = pb + 3;
printf_s("int *pc = pb + 3\n");
printf_s("pc  : %d\n", pc);
printf_s("*pc : %d\n", *pc);

위와 같은코드에

int* pc = pb + 3; 이라는 코드를 활용해 주소값을 바꿔보았다.
여기에서 12바이트가 차이나는데 3이라는 상수를 더한 이유는 
저 3이라는 상수 앞에 sizeof(int) * 3 의 코드가 숨겨져 있기 때문이다.
실행결과는 예상과 같이 아래와 같다.

-실행결과-
pa  : 9829708
pb  : 9829696
*pa : 10
*pb : 20
int *pc = pb + 3
pc  : 9829708
*pc : 10

이렇게 불편해 보이는 포인터를 쓰는 이유는.

1. 배열은 포인터를 사용하여 구현된다. 포인터는 배열을 반복할 때 사용할 수 있다. (배열 인덱스 대신 사용 가능)
2. C++에서 동적으로 메모리를 할당할 수 있는 유일한 방법이다. (가장 흔한 사용 사례)
3. 데이터를 복사하지 않고도 많은 양의 데이터를 함수에 전달할 수 있다.
4. 함수를 매개 변수로 다른 함수에 전달하는 데 사용할 수 있다.
5. 상속을 다룰 때 다형성을 달성하기 위해 사용한다.
6. 하나의 구조체/클래스 포인터를 다른 구조체/클래스에 두어 체인을 형성하는 데 사용할 수 있다. 이는 연결리스트 및 트리와 같은 고급 자료구조에서 유용하다.


'게임 프로그래밍 > C++ 기초' 카테고리의 다른 글

C++ memcpy_s 함수 구현  (0) 2019.01.25
C++ memset 함수 구현  (0) 2019.01.25
C++ WHILE ,DO WHILE (반복문)  (0) 2019.01.25
C++ for (반복문)  (0) 2019.01.25
C++ SWITCH CASE (제어문)  (3) 2019.01.25

+ Recent posts