본문 바로가기
개발/C, C++

[C/C++] 포인터(Pointer) 개념

by 77monkey 개발자 2024. 5. 13.
반응형

 

 

 

 

C언어에서의 꽃은 포인터라는 말을 들어보셨나요? 오늘은 포인터가 무엇인지에 대해서만 다뤄보도록 하겠습니다. 포인터라는 개념을 잘 잡게 된다면 포인터를 이용한 코드들을 이해하는데 큰 도움이 될 것이라고 생각합니다. 

 

포인터(Pointer) 개념

포인터(Pointer)란?

포인터는 메모리 주소를 저장하는 변수입니다. 즉, 포인터 변수가 가지고 있는 값은 메모리 주소이고, 여기에 어떤 방법을 쓰게 되면 가지고 있는 메모리 주소가 가리키고 있는 값을 접근할 수 있습니다. 이렇게 설명하면 이해하기 어렵기에 예를 들어보도록 하겠습니다.

32bit 운영체제에서는 주소 단위가 4 Byte입니다. 64bit 운영체제에서는 주소 단위가 8 Byte입니다. 아래 그림에서는 32bit 운영체제에서의 예시라서 말씀드리게 되었습니다. 아래 포인터(Pointer) 개념 그림을 보도록 하겠습니다. int 타입으로 변수 monkey를 입력했습니다. 그랬을 때 가상의 메모리 공간에 오른쪽 그림과 같이 저장이 됩니다. 0x1000 주소에 77 값이 저장이 됩니다. 여기까지는 어렵지 않으실 것 같습니다. 왼쪽 공간을 보시면 p_monkey라는 변수가 있습니다. 이 변수는 0x1000이라는 값을 가지고 있습니다. 이때 우리는 느낌상 0x1000을 2번째 만나는 것에 대해서 우연이 아니라고 생각이 들 것입니다. 생각해 봅시다. 0x1000 주소에는 어떤 값이 있었나요? 네, 맞습니다. 77이라는 값이 있었습니다. 그러면 p_monkey 포인터 변수는 monkey 변수의 주소를 가리키고 있는 것입니다.

다시 정리를 하자면, p_monkey 포인터 변수가 가지고 있는 값은 monkey 변수의 메모리 주소이고, 이 주소에 특정 방법을 쓰게 되면 77이라는 값을 얻을 수 있습니다.

pointer 개념
포인터(Pointer) 개념

 

아직 설멸을 드리지 않았지만, 위 그림을 코드로 나타내면 아래와 같습니다.

포인터 코드를 작성하는 방법을 바로 알아보도록 하겠습니다.

int main() {
    int monkey = 77;
    int * p_monkey = &monkey;

    return 0;
}

 

포인터(Pointer) 선언 방법

포인터(Pointer) 선언하는 방법은 포인터(Pointer) 개념 그림을 잘 이해하셨다면 한결 쉽게 다가올 수 있을 것 같습니다. 포인터 선언하는 방법은 담고 싶은 변수의 타입을 작성한 다음 "*"를 입력합니다. 그리고 변수명을 작성해 주고 세미콜론(;)을 작성하면 포인터 선언은 완료됩니다.

[타입] *[변수명];

 

포인터(Pointer) 사용 방법

포인터(Pointer) 사용 방법은 포인터 변수에 memory 주소를 할당하고, 그 주소의 값을 *을 톻해서 가져올 수 있습니다.

예시는 위에서 한 번 설명한 코드를 가져왔습니다. monkey 변수는 77을 가지고 있고, p_monkey는 monkey 변수의 주소를 가지고 있습니다. 이렇게 하지 않고 int *p_monkey = monkey;를 하게 된다면, p_monkey는 77을 가지게 되고, 이 주소에 대한 값을 가져오면 알지 못하는 값을 가져오거나 접근할 수 없는 주소를 접근하여 시스템이 죽을 수 있습니다. 즉 원치 않은 동작이 발생하게 되는 것입니다. 그렇기 때문에 pointer 변수의 값에 어떤 값을 주는지 잘 확인하셔야 합니다. 첫 번째 printf문의 결과는 77이고, 두 번째 printf문의 결과는 77입니다. 처음에 설명드린 포인터(Pointer) 개념 그림으로 이해한다면 monkey의 주소가 0x1000이고, p_monkey는 0x1000 주소를 값으로 갖게 됩니다. 해당 변수에 *을 붙이게 되면 해당 주소의 값을 가져오니 77이 되게 됩니다.  세 번째와 네 번째 printf문은 정말 같은 주소인지 확인하는 코드입니다. 이 코드를 각자 컴퓨터에서 돌리게 된다면 각각 다른 값이 나오는데, 위 그림에서 설명드린 것을 기반으로 본다면 0x1000이 나온다는 것을 알 수 있습니다. 

참고로 %p는 포인터 변수의 값을 출력할 때 사용되는 printf 함수에서 사용되는 형식 지정자입니다.

int main() {
	int monkey = 77;
	int *p_monkey = &monkey;

	printf("monkey = %d\n", monkey);
	printf("*p_monkey = %d\n", *p_monkey);
	printf("monkey address: %p\n", &monkey);
	printf("p_monkey value: %p\n", p_monkey);

	return 0;
}

 

마무리

포인터(Pointer) 개념은 정말 너무 어려워서 C/C++을 배우신 분들이 많이 포기하는 부분이기도 합니다. 하지만 천천히 잘 생각하면서 그림을 그려보면 그렇게 어렵지 않은 개념인 것을 알 수 있습니다. 처음 배웠는데 당장 현업에서 쓰이는 코드를 이해하는 데에는 어려움이 있겠지만, 이를 발판으로 포인터에 대한 두려움을 이겨내셨으면 좋겠습니다.

반응형

'개발 > C, C++' 카테고리의 다른 글

[C/C++] call by value VS call by reference  (0) 2024.05.15
[C/C++] printf 함수의 모든 것  (0) 2024.05.15
[C/C++] inline 함수  (0) 2024.05.02
[C/C++] 함수(function)  (0) 2024.05.02
[C/C++] 연산자 우선순위  (0) 2023.09.18