포인터의 개념에 대해 이해하고 코드스니펫을 통해 이해하는 시간을 가졌다.
- 포인터?
- 포인터도 변수이며, 포인터는 값을 담는 대신 변수의 주소를 담는다.
- 예로
int*p와 같이 선언된 p는 정수를 가리키는 포인터로서int변수의 메모리 주소를 저장한다.- 포인터의 특성
- 배열을 복사한다고 가정할 때 배열을 그대로 복사하면 자료의 타입에 따라 용량이 커져 복사할 때 복사 비용이 들게 된다.
- C++에서는 값을 직접 복사한느 방식 대신 변수의 주소를 가리켜서 동일한 데이터에 접근할 수 있도록 해준다. 바로 포인터를 이용해서 말이다.
- 포인터의 주요 특성
- 변수의 주소값을 담을 수 있다.
- 담고 있는 주소값에 해당하는 메모리에 있는 값을 읽거나 수정할 수 있다.
- 포인터가 가져야할 정보
- 변수의 시작 주소
- 변수의 타입(변수의 크기를 알기 위해 필요)
- 시작 주소는 알지만 변수 x, y의 크기 정보는 알 수 없다. 각 변수의 값을 제대로 읽으려면 포인터에 타입 정보가 함께 필요하다.
#include <iostream> using namespace std; int main() { int a = 10; int* p = &a; // 변수 a의 주소를 포인터 p에 저장 cout << "변수 a의 값: " << a << endl; cout << "변수 a의 주소: " << &a << endl; cout << "포인터 p의 값(저장된 주소): " << p << endl; return 0; } /* 출력 결과: 변수 a의 값: 10 변수 a의 주소: 0x61ff08 (주소는 실행할 때마다 다를 수 있음) 포인터 p의 값(저장된 주소): 0x61ff08 */
포인터를 활용하려면 해당 주소에 있는 실제 값을 읽고 수정할 수 있어야 한다.
포인터는 주소를 다루는 특성 때문에 산술 연산도 주소를 제어하는 방식으로 동작한다.
- 역참조 연산자
- A라는 포인터 변수가 있다면, A를 출력하면 주소값이 나오고,*A를 출력하면 해당 메모리 값이 나온다.
- 이러한 원리로 해당 주소에 저장된 값도 변경이 가능하다.
- 포인터 배열과 배열 포인터
- 포인터 배열은 포인터를 원소로 갖는 배열이다.
- 예로
int* ptrArr[4]는 크기가 4이고, 각 원소가int*인 배열이다.- 배열 포인터는 배열 전체를 가리키는 포인터다.
- 단일 변수가 아닌 배열 통째를 가리키는 변수다.
포인터에 대해 배웠지만 배열과 함께 쓸 수 있다는 것이 활용도가 높을 것 같다. 문법이 익숙치 않은 초심자들에겐 익숙해지는 연습이 필요하겠다.
C 문법의 이해, 오늘 배운 것 복습(포인터, 포인터와 배열)