[ C++ ] 포인터

#1 포인터란?

변수의 메모리 주소를 저장하는 변수다. 포인터는 주소를 통해 데이터를 공유를 할 수 있게끔 도와준다.

포인터 선언

변수의 자료형에 따라 포인터의 자료형이 결정된다.

char *p; // 포인터 p의 자료형: char*

#2 포인터와 연산

변수의 주소

주소연산자(&)를 통해 변수의 주소를 반환받을 수 있다.

int a = 123;
int *p = &a; // 변수의 주소 받기

포인터로 값 접근 · 변경

역참조 연산자로 주소가 보관하는 값에 접근하고 값을 변경할 수 있다.

// 값 접근
int a = 456;
int *p = &a;
cout << *p << endl; // 456

// 값 변경
*p = 789;
cout << *p << endl; // 789
cout << a << endl; // 789

변수 출력시 값이 변경 된 걸 확인할 수 있다.

주소를 10진수로 표현하기

포인터는 주소값을 저장한다. 주소값은 16진수 형태다. 10진수 형태로 표현하면 보기가 편하다.

int a = 123;
int *p = &a;
cout << size_t(p) << endl; // 주소를 10진수로 표현

포인터 연산

자료형에 따라 변수가 차지하는 메모리 크기가 결정된다. int는 4바이트, double은 8바이트다. 포인터로 연산을 하면 변수의 메모리 크기의 배수만큼 변동된다. 비교를 위해 10진수 형태로 바꿨다.

int a = 123;
int *p = &a;

cout << size_t(p) << " " << size_t(p + 1) << endl; // 4 만큼 차이

#3 포인터와 배열의 관계

배열의 인덱싱 원리는 포인터 연산과 역참조를 합친 것과 같다.

char my_str[] = {'h', 'e', 'l', 'l', 'o'};

cout << my_str[3] << endl; // l
cout << *(my_str + 3) << endl; // l

배열 변수는 첫번째 원소의 주소값을 가리킨다.