배열과 포인터
* 배열이란?
- 배열은 연관성 있는 자료를 한가지 자료형으로 연결시킨 것이라 할 수 있다.
위의 배열 변수 선언문은 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;
}
결과 화면과 같이 배열의 색인을 사용한 접근과 포인터 증감을 이용한 접근 모두
동일한 결과값을 얻을 수 있는 것을 확인할 수 있다.