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

목차

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

1. 포인터란?

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

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

 

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

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

 

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

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

 

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

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

 

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

int *p = #

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

 

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의 값들은 그대로인 것입니다.

결과를 보시면 분명 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가 가리키는 주소가 바뀌게 됩니다.

 

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

 

포인터 사용 이유

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

 


3줄요약

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