본문 바로가기

Embedded Programming/C/C++

배열과 포인터

* 배열이란? 

 - 배열은 연관성 있는 자료를 한가지 자료형으로 연결시킨 것이라 할 수 있다.



위의 배열 변수 선언문은 int형 변수 10개를 array란 이름으로 묶은 것이다.


위의 array 배열은 메모리에 연속해서 아래 그림과 같이 공간을 할당받는다.



int의 크기인 4 byte 크기로 연속하여 주소를 할당받는 것이다.

그리고 크기가 10인 위의 array배열과 같은 경우에는 색인(index 또는 배열 번호)이 0부터 9까지 할당된다.

각 색인으로 배열의 값에 직접 접근할 수 있다.

예) array[0] = 10; // array의 0번 자료에 10을 대입함.


* 배열의 초기화

배열을 초기화 할때는 숫자 자료형 배열일 경우에는

int array[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; 

와 같은 방식으로 반드시 선언과 동시에 초기화를 해주어야 한다.


int array[10];
array[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

와 같은 방식은 에러가 난다는 것이다.


그 이유는 array[10]은 array의 배열요소중 10번째 배열에 접근한다는 뜻이기 때문이다.

저런 방식으로 값을 대입하려면, 배열 요소별로 하나씩 값을 대입해주어야한다.

array[0] = 10;
array[1] = 20;
array[2] = 30;

......


* 배열과 포인터

int array[10];

위와 같은 배열이 선언되었을 시에는 배열의 이름인 array는 array배열의 시작 주소값을 가진다.

즉, 배열의 이름 자체는 배열의 주소값이므로 포인터와 비슷하다고 할 수 있다.

score[0] = 1;
*(score+0) = 1;

위 두 코드는 같은 의미를 가진다.


하지만 배열 이름은 "주소값 상수"이므로 값을 변경할 수 없다.

그에 반해 포인터는 "변수"이므로 안에 대입되는 주소값이 바뀔수 있다는 것이다.


그리고 배열 요소의 주소를 표현하는 방식은

&score[0]    score + 0

&score[1]    score + 1

...          ...

위 두가지로 나뉜다.

주소(Address)표기법

(Value) 표기법

배열 방식

포인터 방식

배열 방식

포인터 방식

&score[0]

score + 0

score[0]

*(score + 0)

&score[1]

score + 1

score[1]

*(score + 1)


* 포인터로 배열 요소 접근하기

포인터를 배열의 시작주소에 할당했을 경우

포인터 증감 연산으로 배열 요소에 접근할 수 있다.

그리고 신기한 것은 포인터 배열의 색인을 사용하여도 배열에 접근 가능하다는 것이다.


#include <stdio.h>

int main()
{
    int score[10];
    int *p;

    p = score;

    // pointer변수 또한 첨자로 접근 가능.
    score[2] = 99;
    printf(" p[2] : %d\n", p[2]);
    printf("*(p + 2) : %d\n\n", *(p + 2));

    printf(" &p[2] : %08X\n", &p[2]);
    printf(" (p + 2) : %08X\n\n", (p + 2));

    return 0;
}


결과 화면과 같이 배열의 색인을 사용한 접근과 포인터 증감을 이용한 접근 모두

동일한 결과값을 얻을 수 있는 것을 확인할 수 있다.