본문 바로가기
Basic/C/C++

[C언어] 제 16 강 : 배열과 포인터, 포인터 연산

by boxbop 2012. 1. 22.
반응형


 새벽인대 잠이 안와서 포스팅이나 하렵니다~~ㅋㅋㅋㅋ 포스팅 하다보면 잠이 오겠죠^-^ 저번 포인터 그리고 포인터  배열 내용에 계속 되는 부분 입니다~

 * : 메모리 참조
 & : 주소 값 반환

 요 2가지 연산자는 저번 시간에 배웠죠~? 복습합시다~! 포인터를 피연산자로 하는 곱셈과 나눗셈은 불가능하지만 덧셈과 뺄셈은 가능합니다. 포인터에서의 덧셈과 뺄셈은 일반적인 산술연산과는 조금 다른 의미를 가지고 있습니다.

 int number = 1;
 int* ptr = &number;

 여기서 ptr의 값을 10진수로 출력 시켜보고 그리고 ptr++ 을 통해서 값을 증가시켜보고 출력시켜보세요. 결과는 어떻게 나올까요? 처음의 값보다 4가 증가됩니다. 즉 ptr에 1을 더하면 1이 증가해야되지만 4가 증가한다는 얘기입니다. 포인터는 주소값입니다!!! 일반적인 산술연산과는 다르죠. 

 int형 포인터 변수의 값을 1증가시키면, int형 변수의 크기인 4가 증가되고,
double형 포인터 변수의 값을 1증가시키면, double형 변수의 크기인 8이 증가됩니다.

 여기서 우리가 알 수 있는 결론은? 어떠한 특정 자료형의 포인터 값을 1증가 및 감소시, 자료형의 바이트 크기만큼 증가 및 감소합니다.

int array[3] = {1, 2, 3};
int* ptr = &array[1];

배열을 선언하고 포인터 변수 ptr에 배열의 2번째 요소의 주소값을 저장했습니다. 이 상태에서 ptr은 array[1]의 주소값을 가지고 있습니다. *ptr은 2번째 요소인 2를 나타내구요. 그럼 ptr++의 연산 결과는 어떻게 될까요~? array[2]의 주소값을 저장하게 됩니다. 반대로 ptr--의 연산결과는 array[0]의 주소값을 가지고 있겠죠~?

 *array 와 array[0]의 값은 같을까요? 다를까요? 결론은 같습니다. 배열의 이름은 포인터이기 때문입니다. 따라서 array[0], array[1], array[2]는 *array, *(array+1), *(array+2)와 동일 합니다. 즉 array[i]와 *(array+i)는 배열의 이름 관점에서 완전히 동일합니다. 물론 포인터의 관점에서두요^-^

 때문에!!! ptr[0], ptr[1], ptr[2]로도 나타낼 수 있습니다. 왜냐하면 배열의 이름 array가 가지고 있는 주소값과 ptr의 주소값은 동일하기 때문에, 그리고 배열의 이름은 포인터기 때문에 가능하다는 겁니다~!!

 그러나 2차원 배열에서는 조금? 달라집니다.
array1[3][2], array2[3][3], array3[3][4] 이렇게 3개의 2차원 배열이 존재한다고 가정해봅시다. array1 과 array1 + 1의 주소값은 얼마나 차이 날까요? 물론 int형 배열이라는 가정하에 말이죠~ 정답은 8만큼입니다. array2 와 array2 + 1은? 12만큼 array3과 array3 + 1 은 16만큼의 차이를 나타냅니다.

 array2를 예로 들어 보겠습니다. 2차원 배열이고 3X3행렬의 모습을 나타내므로 아래와 같이 표현했습니다.
 array2      ->■□□
 array2 + 1 ->■□□
                    array2 + 2 ->■□□

 즉, 1을 더할 때마다 반환되는 주소 값의 크기는 행의 바이트 크기만큼 증가합니다. 배열의 요소가 int형이므로 4, 가로의 길이가 3이므로 3, 각각 곱하면 12가 됩니다. 따라서 12만큼 크기가 증가하겠죠~? 넵 여기까지 입니다~ㅋㅋㅋㅋ

 포인터는 배열과 아주 큰 연관성을 가지고 있기 때문에 그만큼 배열을 자주 언급하게 되네요~ㅋㅋㅋ 다음 장에서는 포인터와 함수의 관계 그리고 메모리의 할당에 대하여 공부하도록 하겠습니다
반응형