본문 바로가기
프로그래밍/C언어

C언어 공부하기 - 배열과 포인터

by 헬맷쓰다 2020. 10. 15.
반응형

지난 시간에 포인터의 개념에 대해 간단히 살펴 보았습니다. 살짝 정리해 보면,,

포인터메모리의 주소를 저장하는 변수입니다. C언어에서 포인터를 선언할 때는 일반 변수를 선언하듯이 하면 되는데 변수 앞에 기호 Asterisk 즉 "*"를 붙여 주면 되고, 기본 자료형(문자형, 정수형, 실수형 등)의 주소를 포인터 변수에 넣을 때는 기본 자료형 변수앞에 Ampersand 즉 "&"를 붙여서 포인터 변수에 저장하면 됩니다. 지난 시간에 길게 포스팅한 내용은 아래 소스로 정리할 수 있습니다.

// 정수형 변수 선언
int ival = 3;

// 정수형 변수를 가리키는 포인터 선언
int *iptr;

// 정수형 변수의 주소를 포인터 변수에 assign
iptr = &ival;

// 결과 출력
printf ("주소 %ld에 값 %d 저장됨\n", iptr, *iptr);

 

이렇게 기본 자료형만 다룬다면 C언어에서 포인터의 강점을 알기 힘들겠죠. 배열과 함께 사용할 때에야 비로소 포인터의 매력(특히 연산적인 관점)을 조금 엿볼 수 있답니다.

먼저 다음과 같이 배열을 정의해 봅니다.

int x[5];

이게 무슨 뜻이었죠? 그쵸! 크기가 5인 정수형 배열을 선언한 겁니다. 그림으로 표현하면 다음과 같습니다.

배열을 사용할 때는 정수형 변수 x[0], x[1], x[2], x[3], x[4] 다섯개가 연속으로 있는 것처럼 사용하면 됩니다. 이 배열을 포인터를 사용하여 연산하기 위해 정수형을 가리키는 포인터를 선언하고 배열로 선언한 변수의 주소를 넣어 보겠습니다. 소스를 보시죠.

int *px;

px = &x[0]; // px = x;와 동일함

소스의 두 번째 줄을 보면 포인터 변수 px에 배열의 첫번째 요소의 주소를 대입했습니다. 그림으로 표현하면,

포인터 변수 px가 배열의 처음을 가리키고 있습니다. 화살표는 주소를 가리키고 있다고 생각해 주세요. 소스의 주석에 포인터 변수 px에 배열의 이름을 대입했는데 배열의 이름은 배열의 첫번째 요소의 주소를 의미하기 때문에 완전 동일한 의미입니다.

이제 배열의 내용을 포인터 변수를 이용해서 어떻게 확인하는지 볼께요. 우선 다음 코드의 의미를 생각해 봅시다.

a = *px;

이렇게 하면 a는 x[0]과 동일한 값을 갖게 됩니다. 그러면 x[1]의 값은 포인터 변수로 어떻게 확인할까요? 놀랍게도....

a1 = *(px+1);

여기서 px+1의 의미를 생각해보면 px가 배열 x[0]의 주소를 가지고 있으니 주소의 값에 1을 더한 값을 가질테고 *(px+1)은 x[0]의 주소에 1을 더한 주소의 내용이 아닐까요? 아쉽지만 px가 배열에 대한 포인터일때 1을 더한 값은 그냥 숫자 1이 아니라 px에서 1개 다음 배열요소를 가리키게 됩니다.  그림으로 살짝 정리하면 다음과 같습니다.

그러니까 배열 x의 i번째 요소인 x[i]를 포인터를 사용하면 *(px+i)로 사용할 수 있다는 말입니다. 당연히 괄호에 주의해 주셔야 합니다.

이게 어쨌다구요? 포인터로 인해 배열로부터 자유를 얻었다구요. 위의 소스에서는 포인터가 배열의 첫번째 요소를 가리켰지만 중간요소를 가리킬 수도 있고 포인터는 변수이므로 증감연산자(++, --), 산술연산자 (+,-,*,/)를 쓸 수 있습니다.

int x[5] = {1,2,3,4,5};
int *px;

px = &x[1];

printf("두번째 요소 : %d\n", *px);
px--;
printf("첫번째 요소 : %d\n", *px);
px = px + 3;
printf("네번째 요소 : %d\n", *px);

*** 실행 결과 ***
두번째 요소 : 2
첫번째 요소 : 1
네번째 요소 : 4

포인터 변수에 배열의 첫번째 요소가 아닌 두번째 요소의 주소를 넣은 다음에 가지고 논 소스 입니다. 찬찬히 살펴 보시고 이것 저것 더하고 빼고 지지고 볶고 해보세요.

포인터를 배열과 함께 언급하지 않으면 안될 이유가 있었죠? 이번 포스팅에서 기억해야할 점은 딱! 한가지 입니다. 바로 "배열의 인덱스(Index) 표현과 포인터의 옵셋(Offset) 표현은 동일(Identical)하다!"입니다.

다음에는 수도 없이 쓰이는 문자열이라고 하는 문자형 배열과 포인터에 대해 알아보도록 하죠. 안녕~

반응형

댓글