' [C/C++] 10. 포인터 (1)

Programming/C & C++

[C/C++] 10. 포인터 (1)

mdisprgm 2022. 3. 24. 13:06
728x90

(1) C와 포인터

포인터란, C가 그 진가를 발휘하는 문법이다.

 

C의 가장 큰 특징이자 장점이자 단점은 어셈블리 제외 고급 언어들 중 가장 기계어와 가깝다는 것인데

 

이는 이론 상 프로그램의 거의 모든 것을 제어할 수 있다는 말이 된다.

 

다시 말해 개발자에게 주어지는 자유도가 높다는 것인데

 

개발자에게 자유를 준다는 것은, 곧 (언어, 컴파일러 차원에서) 알아서 해준다는 게 없다는 뜻이다.

 

이것이 주니어 개발자일수록 단점으로 작용할 수도 있지만

 

그만큼 low-level에서 필요한 기초 지식들을 익힌다는 것이기 때문에

 

그런 것들을 자동으로 해주는 라이브러리나, 상위 고급 언어들을 사용할 때

 

보다 쉽게 익힐 수 있게 된다.

 

(2) 포인터란

본격적으로 포인터에 대해 설명한다.

 

 

포인터는 영어로 쓰면 Pointer이다.

 

Point, 말 그대로 가리키는 용도이다.

 

그렇담 무엇을 가리키는가?

 

변수를 가리킨다. 정확히 말하면 변수가 차지하고 있는 메모리 공간을 가리킨다.

 

 

RAM, Random Access Memory, 카세트 테잎 같은 것과 다르게 아무 곳이나 접근할 수 있다는 뜻이다.

 

왜냐하면 메모리 공간이 Byte단위로 나뉘면서 각 공간마다 주소를 갖고 있기 때문이다.

 

포인터도 일종의 변수인데, 포인터 변수가 저장하는 값도 그 주소들이다.

 

어떤 변수가 저장된 메모리 공간의 주소를 포인터 변수에 저장함으로써 그 변수를 가리키게 된다.

 

(3) 포인터 사용법

포인터를 사용하기 위하여 알아야할 것 두 가지가 있는데

1. 포인터 변수 선언하기

2. 변수의 주소 (포인터 상수) 얻기

이다.

 

포인터 변수를 선언하는 방법은

 

변수 이름 앞, 또는 자료형 뒤에 *(asterisk)를 붙이면 된다.

 

이러한 포인터 타입은 일반 타입과 다른데, 

 

int와 int형 변수의 포인터 int*는 서로 다른 타입이다.

 

 

변수의 주소(포인터 상수)를 얻는 방법은 간단하게 변수 이름 앞에 &를 붙이면 된다.

 

따라서 아래 코드는 ptr_a라는 int* 변수에 &a, 즉 a의 주소를 저장하는 코드이다.

#include <stdio.h>

int main() {
	int a = 10;

	int* ptr_a = &a;
}

이제 ptr_a는 a를 가리키는 포인터라고 할 수 있다.

 

주소를 직접 확인하고 싶다면 printf에서 %p를 사용하면 된다.

0x0000002430BBF714 라는 위치에 10이라는 값이 저장되어 있는 것이다.

 

여기서 0x0000002430BBF714는 16진수 값으로, 메모리 주소는 범위가 매우 넓기 때문에 16진수로 출력하는 것이 효울적이다.

 

16진수가 눈에 익지 않으면 %d로 출력해도 되지만 권장 사항이기도 하고 16진수에 익숙해지기 위해서는 %p를 사용하는 것이 좋다.

 

 

이번 글에서 포인터가 무엇인지에 대해 아주 단초적인 예제만 사용했다.

 

포인터의 장점은 "역참조"가 가능하다는 것과 "복사 비용"을 줄일 수 있다는 것인데

 

그것들에 대해서는 나중 포스팅에서 이어가겠다.

728x90

'