강좌 & 팁
배열과 포인터
배열과 포인터는 컴퓨터 내부적으로 거의 같은 방법으로 메모리에 접근한다.
포인터는 메모리의 주소를 가지는 변수로 그 주소를 이용해서 메모리에 접근하는 것에 비해, 배열명은 그 배열에 할당된 메모리의 시작주소를 나타내는 상수이다.
배열이 선언되면 배열의 자료형과 크기에 따라 메모리가 할당되고, 배열의 이름은 이 메모리의 시작주소가 된다.
함수가 실행되는 동안 배열리 가리키는 주소는 변하지 않는다. 이에 반해서 포인터는 변수이기 때문에 프로그램의 실행도중에 값이 변해서 다른 메모리를 가리킬 수 있다.
다음의 배열의 주소를 출력하는 예제를 보자
#include <stdio.h>
int main ()
{
int inum;
int score[5];
printf ( "%p\n", score);
for (inum = 0; inum < 5; inum++)
{
printf("&score[%d]: %p\n", i, &score[i]);
}
return 0;
}
score 는 주소값 상수로 여기서는 0xbfb07938 이며, 배열의 각원소의 주소값은 4바이트씩 증가되었다. 배열은 항상 첫 번째 원소를 가리킴으로 첫 번째 원소의 주소값과 같다.
배열은 주소값 상수이므로 값이 변하지 않는데 비해서, 포인터 변수는 주소값을 가지는 변수로 값이 변한다.
다음의 포인터 변수를 이용한 배열의 주소값 출력 프로그램을 보자
#include <stdio.h>
int main ()
{
int inum;
int score[5];
int *p;
p = score;
for(inum = 0; inum < 5; inum++)
{
printf ( "&score[%d]: %p\tp: %p\n", i, &score[inum],p++);
}
return 0;
}
변수의 선언되 되면 다음과 같이 메모리가 할당된다.
p = score;
포인터 변수 p가 배열 score의 주소값으로 초기화 된다.
출력결과에서 포인터 변수 p는 4씩 증가된다. 포인터 변수 p가 int형을 가리키기 때문이다.