(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를 사용하는 것이 좋다.
이번 글에서 포인터가 무엇인지에 대해 아주 단초적인 예제만 사용했다.
포인터의 장점은 "역참조"가 가능하다는 것과 "복사 비용"을 줄일 수 있다는 것인데
그것들에 대해서는 나중 포스팅에서 이어가겠다.
'Programming > C & C++' 카테고리의 다른 글
[C/C++] 백준 1436번 C/C++ 풀이 (0) | 2022.11.10 |
---|---|
[C/C++] 백준 1159번 C++ 풀이 (0) | 2022.10.31 |
[C/C++] Cos Pro 1급 모의고사 - 꽃피우기 풀이 (0) | 2022.01.28 |
[C/C++] 9.5강 - for, while에서 break, continue (0) | 2022.01.17 |
[C/C++] 9.4강 - switch & break | 제어문, 조건 관리하기 (0) | 2022.01.15 |