배열은 자료형이 같은 변수를 메모리의 연속적 으로 할당한다
char ary[3]이라는 배열을 선언했다고 가정해 보자
그림을 통해 살펴보자
char형 변수의 크기는 1바이트 라면 각각의 배열 요소의 주소는100,101,102 번지가 된다
배열명 ary는 첫 번째 배열의 요소의 주소 값 이면선 첫 번쨰 배열 요소를 가리킨다
*ary = ary[0] 이고 ary = 100 이다
주소값은 특별한 연산 규칙을 가진다
주소 + 정수 => 주소 + (정수 * 변수의 크기)
코드를 통해 알아보자
int ary[3];
int i = 0;
*(ary) = 10;
*(ary + 1) = 20;
*(ary + 2) = 30;
for (i = 0; i < 3; i++)
{
printf("%3d", *(ary + i));
}
실행을 해보면 10 20 30이 정상적으로 출력된다
주소값 연산 규칙을 적용해서 살펴보면 ary 주소값이 100이라 가정한다면
ary +1 => 100(ary 주소값) + 1 4(int의 크기)
따라서 ary + 1 =104로 두번째 배열요소의 주소값을 의미한다
ary[1] (배열 요소 표현식) <=> (ary +1) (포인터 연산식)은 표현이 다를뿐 같은 뜻을 의미한다
배열의 이름은 주소값 이므로 포인터를 이용해 저장할수 있다
이를 통해 포인터를 배열처럼 사용할수 있다
코드를 살펴보자
int main(void)
{
int ary[3];
int* pary = ary;
//포인터 연산식
*(pary) = 10;
*(pary + 1) = 20;
*(pary + 2) = 30;
for (int i = 0; i < 3; i++)
{
printf("%d\n", *(pary + i));
}
//배열 연산식
pary[0] = 100;
pary[1] = 200;
pary[2] = 300;
for (int i = 0; i < 3; i++)
{
printf("%d\n", pary[i]);
}
return 0;
}
실행결과
10 20 30 100 200 300으로 정상으로 출력된다
포인터를 이용해 배열명을 저장하면 포인터는 포인터 연산 혹은 배열 표현식을 이용해 배열요소에 접근할수 있다