[C++] 포인터 사용해보기

목차

  1. 포인터 개념
  2. 포인터를 사용하는 이유 with 코드

1. 포인터란?

포인터는 다른 변수, 또는 그 변수의 메모리 공간주소를 가리키는 변수입니다.

프로그래밍 언어를 공부하실때 처음으로 큰 벽을 느끼게 되는 구간입니다. 필자인 저도 처음 코딩을 배울때 포인터에서 벽을느껴 잠시 도피를 해왔었기에 얼마나 큰 벽인지 알고있습니다.

 

다른 변수의 메모리 공간 주소를 가리키는 변수라고 설명했는데 먼저 자료형의 메모리공간부터 알아보겠습니다.

이해를 돕기위해 순서대로 설명드리겠습니다.

 

1. 코딩을 하기위해 비주얼 스튜디오나 다른 툴을 켰을때에 아무 글자없는 밑 그림과 같은 도화지같은 화면을 보셨을겁니다. 저희는 상상으로 2차원평면의 우주같은 공간이라고 생각합시다.

etc-image-0

2. 저희가 코딩을 하게되면 밑에 코드와 같이 변수를 선언하게 됩니다.

etc-image-1

 

etc-image-2

저희는 여백에 int형 크기의 num이라는 이름으로 메모리를 할당한 것입니다.

세상에는 집에 주소들이 있듯이 이 공간에도 주소란 개념이 존재합니다. 저 위치가 바로 num이라는 메모리공간의 위치이자 주소입니다. 이 주소를 0x1A 라고 하고 가정하겠습니다.

 

포인터는 보통 자료형 *변수이름; 으로 선언합니다. 보통 변수를 선언시에 자료형과 변수이름 사이에 * 를 넣으면 포인터가 됩니다

int *p = #

    &는 변수의 주소값을 나타냅니다.

etc-image-3

 

int형 포인터를 선언하면 int형과 같은 크기의 메모리를 할당하고 num의 주소값(0x1A)을 가리킨다는 뜻으로 해석됩니다.

 


2. 포인터를 사용하는 이유 - with 코드

#include <iostream>

void Swap(int num, int num2) { //num과 num2를 바꾸는 함수
	int temp = num;
	num = num2;
	num2 = temp;
}

int main(void) {
	int num = 5;
	int num2 = 10;

	Swap(num,num2); //함수호출 및 실행

	std::cout << "Swap결과값: " << num << " " << num2;

	return 0;
}

함수를 사용시에 Main함수에서 num과 num2를 Swap함수의 매개변수로 보내게 되는데 이때 매개변수 num과 num2를 별개로 메모리공간을 할당하여 Main 함수의 num과 num2의 값을 "복사"하여 보내게 되는것입니다.

그러면 저 함수에서는 Main함수에서의 num과 num2의 값과는 별개로 Swap함수에서만의 num과 num2의 값만 바뀐것이고 Main의 값들은 그대로인 것입니다.

etc-image-4

결과를 보시면 분명 Swap을 시켰음에도 값이 그대로인것을 볼 수 있습니다.

 

이 함수를 포인터를 사용하면 값을 바뀌도록 할 수 있습니다.


포인터를 사용하여 Swap하기

#include <iostream>

void Swap(int *Snum, int *Snum2) { //num과 num2를 바꾸는 함수
	int temp = *Snum;
	*Snum = *Snum2;
	*Snum2 = temp;
}

int main(void) {
	int num = 5;
	int num2 = 10;

	Swap(&num,&num2); //주소값을 보냄.

	std::cout << "Swap결과값: " << num << " " << num2;

	return 0;
}

변수의 이름이 같으면 헷갈릴까봐 Swap함수의 num들에 S만 붙여서 바꾸었습니다.

 

Main을 보시면 주소값을 보내서 Swap함수에 포인터로 보낸다고 보실텐데,

이는 Swap함수의 포인터 *Snum과 *Snum2가 Main함수의 num과 num2를 가리킨다고 이해하시면 됩니다.

 

Swap 함수

1. temp에 *Snum이 가리키는 main의 num주소를 저장

2. 비어있는 *Snum에 / main의 num2를 가리키는 / swap 함수의 *Snum2를 저장

3. 비어있는 *Snum2에 처음 main의 num을 가르켰던 *Snum의 값인 temp를 저장

 

이러면 각 메모리 주소를 가리키는 *Snum과 *Snum2가 가리키는 주소가 바뀌게 됩니다.

 

etc-image-5

결과적으로 값이 바뀐 것을 볼 수 있습니다.

 

포인터 사용 이유

이렇게 포인터를 사용하면 효율적인 코드 작성과 처리가 가능합니다.
또한, 배열과 리스트 같은 자료구조를 더 쉽게 접근할 수 있습니다.

 


3줄요약

  1. 포인터는 다른 변수를 가리키는 변수다
  2. 포인터를 코드와 함께 이해해보자
  3. 포인터를 잘 이해하면 효율적인 코드와 자료구조 접근에 용이하다.