1. 배열과 포인터
배열이란 같은 자료형의 변수를 여러 개 만들어야 할 경우, 이것을 보다 편리하게 도와주는 문법입니다.
// int 자료형 변수를 100개 선언 int num1 = 1; |
이처럼 int 자료형 변수를 100개 선언해야 한다고 했을 때, 우리는 각 변수의 이름이 중복되지 않게 일일이 다르게
지어야 하고, 변수를 선언하는 과정을 100번 적어야 할 것입니다.
하지만 배열이라는 녀석을 활용하면 다음과 같이 간단해 질 수 있습니다.
// int 자료형 변수를 100개를 가진 배열 |
위 구문으로 우리는 100개의 int 형 변수를 만들었습니다.
여기서 arrInt 라는 녀석은 배열의 이름이라고 부릅니다. 이 배열의 이름을 통해서 우리는
만들어진 100개의 변수에 접근이 가능합니다.
arrInt[0] 은 100개의 변수 중 가장 첫 번째를 나타냅니다. 당연히 arrInt[1] 은 그 다음 두 번째 변수를 나타냅니다.
이와 같이 확장하여 100번째 변수는 바로 arrInt[99]입니다. 즉 arrInt[100] 으로 접근하는 것은 선언한 배열 범위를 벗어나는 것입니다.
배열의 특징 중 하나는 배열의 각 요소들이 선형구조라는 것입니다.
메모리 위치로 보았을 때 배열의 첫 번째 요소부터 마지막 요소까지 바로옆에 이어져있다는 것입니다.
배열의 또 다른 특징은 바로 배열의 이름이 첫 번째 요소의 그 시작주소를 나타낸다는 것입니다.
이것은 배열과 포인터의 긴밀한 관계가 있음을 나타냅니다.
위 그림처럼 배열의 시작 주소 번지가 100 이라고 했을 때, 배열의 이름인 arrInt 는 그 시작 주소값를 나타냅니다.
2. 포인터 의 증감 연산의 의미
포인터는 주소를 담는 변수입니다. 다음과 같이 포인터에 덧셈, 혹은 뺄셈을 한다는 것은 무엇을 의미하는 것일까요?
// 포인터 변수에 증감연산 |
int 자료형 으로 10개의 변수를 가지는 배열을 선언했습니다. 그 배열의 이름 arrInt 는 그 시작 주소이며,
각 요소는 int 타입이므로 int 형 변수의 주소를 가질 수 있는 int* 타입의 pInt 에 배열의 시작 주소를 저장했습니다.
pInt 에 1을 더한다는 의미는, pInt 값에 int 자료형의 크기만큼 더한다는 의미입니다. 따라서 4가 증가하겠죠?
즉 해당 포인터가 저장할 수 있는 자료형 타입 사이즈만큼 그 크기가 커집니다.
(ex - short* 포인터는 +1 할 경우 그 값이 short 자료형 크기인 2만큼 증가합니다.)
이것을 이용하면 포인터는 자신이 가리키는 배열 시작주소에서 변수의 크기 알고서, 다음 메모리 위치만큼
값을 증가시킬 수 있습니다.
배열의 시작 주소로부터 5번째 떨어진 요소의 원본으로 접근하는 방법은 다음과 같습니다.
// 포인터를 통한 배열의 요소 접근 |
arrInt 는 배열의 시작 주소이고, 여기에 4를 더한다는 것은 배열의 시작부터 5번째 요소의 주소값이 됩니다.
그 주소값 앞에 *을 붙이는 의미는 주소를 통해서 원본으로 접근한다는 것을 우리는 알고 있습니다.
우리가 알고 있는 arrInt[4] 의미가 바로 *(arrInt + 4) 표현방식을 보다 편하게 만들어 놓은 것입니다.
- by Raimondo
'정보 & 소식 > C, C++' 카테고리의 다른 글
[Effective C++] #define 보다 const, enum, inline 을 활용해보자 (0) | 2016.05.19 |
---|---|
[Effective C++] 클래스의 생성 (0) | 2016.05.18 |
포인터와 운영체제 (0) | 2016.04.28 |
C언어 포인터 (0) | 2016.04.28 |
전처리문의 종류 (0) | 2016.04.28 |