게임학원, 게임프로그래머 취업 전문 교육기관 DirectX11/12 자체엔진 게임개발과정,서버프로그래밍,자료구조,알고리즘,유니티,언리얼 게임학원, 언리얼학원 배열과 포인터
본문 바로가기

배열과 포인터

1. 배열과 포인터


 배열이란 같은 자료형의 변수를 여러 개 만들어야 할 경우, 이것을 보다 편리하게 도와주는 문법입니다.


// int 자료형 변수를 100개 선언

int num1 = 1;
int num2 = 2;
int num3 = 3;
int num4 = 4;
int num5 = 5;
int num6 = 6;
....
...
..

이처럼 int 자료형 변수를 100개 선언해야 한다고 했을 때, 우리는 각 변수의 이름이 중복되지 않게 일일이 다르게

지어야 하고, 변수를 선언하는 과정을 100번 적어야 할 것입니다.


하지만 배열이라는 녀석을 활용하면 다음과 같이 간단해 질 수 있습니다.


// int 자료형 변수를 100개를 가진 배열
int  arrInt[100] = {0};


위 구문으로 우리는 100개의 int 형 변수를 만들었습니다.

여기서 arrInt 라는 녀석은 배열의 이름이라고 부릅니다. 이 배열의 이름을 통해서 우리는

만들어진 100개의 변수에 접근이 가능합니다.


arrInt[0] 은 100개의 변수 중 가장 첫 번째를 나타냅니다. 당연히 arrInt[1] 은 그 다음 두 번째 변수를 나타냅니다.

이와 같이 확장하여 100번째 변수는 바로 arrInt[99]입니다. 즉 arrInt[100] 으로 접근하는 것은 선언한 배열 범위를 벗어나는 것입니다.


배열의 특징 중 하나는 배열의 각 요소들이 선형구조라는 것입니다.

메모리 위치로 보았을 때  배열의 첫 번째 요소부터 마지막 요소까지 바로옆에 이어져있다는 것입니다.

배열의 또 다른 특징은 바로 배열의 이름이 첫 번째 요소의 그 시작주소를 나타낸다는 것입니다.

이것은 배열과 포인터의 긴밀한 관계가 있음을 나타냅니다.


위 그림처럼 배열의 시작 주소 번지가 100 이라고 했을 때, 배열의 이름인 arrInt 는 그 시작 주소값를 나타냅니다.



2. 포인터 의 증감 연산의 의미

  

포인터는 주소를 담는 변수입니다. 다음과 같이 포인터에 덧셈, 혹은 뺄셈을 한다는 것은 무엇을 의미하는 것일까요?

// 포인터 변수에 증감연산

int arrInt[10] = {0};

int* pInt = arrInt;

pInt += 1;

int 자료형 으로 10개의 변수를 가지는 배열을 선언했습니다. 그 배열의 이름 arrInt 는 그 시작 주소이며,

각 요소는 int 타입이므로 int 형 변수의 주소를 가질 수 있는 int* 타입의 pInt 에 배열의 시작 주소를 저장했습니다.


pInt 에 1을 더한다는 의미는, pInt 값에 int 자료형의 크기만큼 더한다는 의미입니다. 따라서 4가 증가하겠죠?


즉 해당 포인터가 저장할 수 있는 자료형 타입 사이즈만큼 그 크기가 커집니다.

(ex - short* 포인터는 +1 할 경우 그 값이 short 자료형 크기인 2만큼 증가합니다.)


이것을 이용하면 포인터는 자신이 가리키는 배열 시작주소에서 변수의 크기 알고서, 다음 메모리 위치만큼

값을 증가시킬 수 있습니다.


배열의 시작 주소로부터 5번째 떨어진 요소의 원본으로 접근하는 방법은 다음과 같습니다.


// 포인터를 통한 배열의 요소 접근

*(arrInt + 4) = 11;

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