배열과 포인터

배열과 포인터는 컴퓨터 내부적으로 거의 같은 방법으로 메모리에 접근한다.

포인터는 메모리의 주소를 가지는 변수로 그 주소를 이용해서 메모리에 접근하는 것에 비해, 배열명은 그 배열에 할당된 메모리의 시작주소를 나타내는 상수이다.

배열이 선언되면 배열의 자료형과 크기에 따라 메모리가 할당되고, 배열의 이름은 이 메모리의 시작주소가 된다.

함수가 실행되는 동안 배열리 가리키는 주소는 변하지 않는다. 이에 반해서 포인터는 변수이기 때문에 프로그램의 실행도중에 값이 변해서 다른 메모리를 가리킬 수 있다.

다음의 배열의 주소를 출력하는 예제를 보자

 

#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;
}

 

 

 

ap01.png

 

 

score 는 주소값 상수로 여기서는 0xbfb07938 이며, 배열의 각원소의 주소값은 4바이트씩 증가되었다. 배열은 항상 첫 번째 원소를 가리킴으로 첫 번째 원소의 주소값과 같다.

 

ap02.png

 

 

배열은 주소값 상수이므로 값이 변하지 않는데 비해서, 포인터 변수는 주소값을 가지는 변수로 값이 변한다.

다음의 포인터 변수를 이용한 배열의 주소값 출력 프로그램을 보자

 

#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;
}

 

ap03.png

 

 

변수의 선언되 되면 다음과 같이 메모리가 할당된다.

 

 ap04.png

 

p = score;

포인터 변수 p가 배열 score의 주소값으로 초기화 된다.

 

 ap05.png

 

 

출력결과에서 포인터 변수 p는 4씩 증가된다. 포인터 변수 p가 int형을 가리키기 때문이다.