본문 바로가기

프로그래밍/C언어

[C언어 with Java] 배열과 포인터

 

 

 

C Prog. with Java


C언어를 다루고 있지만, 다른 프로그래밍 언어인 자바와 비교하면서 내용을 구성하고 합니다. 본 글은, 자바를 먼저 어느정도 알고 계시고, 저와 같이 C언어를  공부하고자 하는 분들에게 도움이 되길 바랍니다.

 

 포인트라는 것을 알았으니, 포인트를 이용해서 배열을 조작해보록 합시다.

우선 소스를 보고 시작할게요.

 

 

 위의 소스는 int형과 double 타입의 배열을 선언한뒤, 그 각각의 요소에 포인터를 배정했습니다.

그리고 포인터를 찍어서, 배열 요소 각각의 주소를 찍어 보았더니, 위의 색칠한 부분처럼 int형은 4씩 주소가 늘어난 것이 확인되었고, double형은 8씩 늘어난 것을 확인할 수 있었습니다.

 

 이 부분을 미루어 볼때, 배열의 각 요소의 포인터 값은 선언된 배열의 형의 사이즈에 맞게 값이 증가된 것을 볼 수 있습니다. (참고로 int형의 사이즈는 4바이트, double형의 사이즈는 8바이트입니다. 노파심에 사이즈 찍어드립니다.)

 

 이를 확인 하셨다면, 다음을 봅시다.

 

 포인터도 연산이 가능합니다. 자세한 설명보다 우선 소스를 보면서 이해를 합시다.

 

 

 포인터에 1을 더해주는 연산을 하였습니다. 결과를 살펴보면 주소값이 4가 늘어난 것을 확인할 수 있군요.

그렇습니다. 위의 과정을 보셨으면, 알아채신 분들이 계실겁니다.

 

 포인터에 연산을 해주게 되면, 그 주소값이 변수의 선언된 형(Type)의 크기에 맞게 늘어난 것을 확인 할 수 있습니다.

이를 배열에 접목시킨다면, 배열의 각 요소를 가리키고 있는 포인터가 역시 동일한 형태로 증가됨을 보았을때, 이런 연산을 통해서 배열의 요소를 접근하고 제어할 수 있겠습니다. 설명보다 결과를 보는게 이해가 더 빠르겠군요.

 

 

 

 자, 포인터를 통해서 배열의 요소를 출력해보았습니다.

 배열의 요소가 int 사이즈대로 4바이트 간격을 두고 주소값을 배정받고 있기 때문에, 위처럼 연산을 했을 경우,

원하는 결과값을 얻을 수 있었습니다.

 

 참고로, A[0]의 주소값과 배열의 주소값이 동일하기 때문에 포인터를 설정한 부분을 다음과 변형 가능합니다.

 

 배열의 이름은 곧 A[0]의 주소값, 즉 포인터와 동일하다고 생각하시면 됩니다.

그래서 arr[i]와 *(arr + i)가 동일한 문장이라고 볼 수 있겠습니다.(여기서 i는 인덱스입니다.)

 

 이처럼 포인터 연산을 통해서 배열에 접근을 해보았는데요. 알아될 것은 다음과 같이 정리 가능합니다.

1. 포인터는 연산이 가능하다.

2. 포인터에서 가능한 연산자는 덧셈과 뺄셈만 존재한다.

3. 포인터가 연산자에 의해서 증감할 때, 이의 값(주소)을 결정짓는 것은 포인터형이다.

 

 포인터에 있어서 배열 사용의 기초적인 내용입니다. 꼭 알아둡시다.