#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
배열 변수는 첫번째 원소의 주소값을 가리킨다.