(C++) Pointer 1

포인터의 정의

  • 방학동안 C++을 끄적끄적 공부하면서 가장 어렵다고 느꼈던 부분은 단연 포인터였다. 이미 학교 수업에서 Java, Python 을 체험해보았기에 입출력, 함수, 클래스, 객체 등의 부분은 스스로도 어느정도 이해할 수 있었다. 하지만 C++의 포인터 개념은 매우 생소하게 느껴졌고 보면 볼수록 미궁속으로 빠지는 느낌이 들었다. 그래서 남은 방학동안 [포인터] 라는 것을 확실히 알고 넘어가고자 한다. 공부한 내용을 이 블로그에 정리해보는 식으로 해봐야겠다.
포인터 : "메모리 내의 특정 위치의 주소"

포인터 변수 : "주소(포인터)를 저장하는 변수"

포인터를 쓰는 이유가 뭐지

내가 가장 궁금했던 부분이다.

굳이 왜 이런 헷갈리는 개념을 넣은거지…

깊게 들어가면 더 심오한 이유가 많겠지만 찾아본 결과

일반 변수를 이용할 때보다 효율적 이기 때문이라고 한다.

연산 수행 함수 f() 에 변수 a 를 넣어 연산하고 싶을때, a를 f()에 넘겨주면서 연산을 처리하게 된다.

즉, 변수 a 가 가지고 있는 값이 넘어간다는 것이다.

그런데 사실은 이 과정에서 값을 복사해서 함수로 가져간다고 한다.

그말은… 새로운 메모리를 확보해서 그곳에 값을 넣는 것이다.

간단한 연산이면 전혀 문제가 없겠지만, 만약에 규모가 큰 데이터를 넘겨준다면?

매번 메모리 확보하고, 데이터 복사하는 시간이 발생하기 때문에 시간과 메모리의 소모가 많을 것이다.

그러므로 값을 넘기는 대신에 값의 주소값을 넘김으로써 주소를 통해 값을 읽어오면 따로 메모리 확보가 필요가 없으니 시간과 메모리를 절약할 수 있다.

흥미로운 이유였다.

포인터의 형식

선언 방식은

자료형 *변수형;

int *ptr;

예제

#include <iostream>

using namespace std;

int main()
{
	int num = 10;
	int *ptr;
	ptr = &num; // & 연산자는 변수 앞에 붙어 변수가 저장된 메모리의 시작주소를 나타냄

	cout << num << endl;
	cout << *ptr << endl;
	cout << &num << endl;
	cout << ptr << endl;
}

결과값

10
10
0137FEA8
0137FEA8
계속하려면 아무 키나 누르십시오 . . .
  • num : 10
  • *ptr : 포인터 변수 ptr 이 가리키는 주소에 저장된 값을 출력한다. * 연산자는 포인터 변수 앞에 붙어 포인터 변수가 가지는 주소에 있는 값을 리턴한다. 정리하면,

포인터 변수는 &을 통해 주소값을 얻어오고, *을 통해서 그 값을 참조하여 변수 값을 얻어온다.

ptr == &num
*ptr == num
  • &num : num의 주소값
  • ptr : ptr이 저장하고 있는 값, 즉 num의 주소값

난잡하게라도 정리해봤다…