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 |