Shine's dev log

[C] 배열과 포인터의 관계 본문

프로그래밍, 알고리즘

[C] 배열과 포인터의 관계

dong1 2020. 3. 26. 12:48

C를 처음 배우면 가장 먼저 배우는 것 중에 하나가 바로 배열이다.

 

배열은 대괄호 연산자 [ ]를 이용하여 굉장히 직관적으로 초기화되고, 사용되기 때문에 사실 별 어려움없이 사용할 수 있다.

 

하지만, 이후에 포인터를 배우고 배열과 포인터가 밀접하게 연관되어있다는 사실을 알게되면 멘붕에 빠지기도 한다;;

 

이번에는 배열과 포인터의 관계에 대해 깔끔하게 정리해보도록 하자.

 

#include <stdio.h>

int main() 
{
	int arr[10] = {0, };
	print("%d", arr[0]);
}

위와같이 int형 변수 10개를 담은 arr라는 배열을 만들어봤을 때, arr[0]의 값을 print하면 당연히 0이 나온다.

 

하지만, arr[0]이 아닌 arr를 출력하면 뭐가 나올까?

 

#include <stdio.h>

int main() 
{
	int arr[10] = {0, };
	printf("%d", arr);
}

 

결과값은 알수없는 숫자들이 나온다.

딱봐도 이것은 주소라는 것을 알 수 있는데, 여기서 처음 배열을 배울때는 몰랐던 중요한 사실을 알 수 있다.

 

배열명은 그 배열이 할당된 메모리의 시작주소값을 나타낸다.

 

그렇다면, 우리가 자주 썼던 arr[2] 와같은 표현을 arr를 이용하여 나타내보자.

 

우선 arr가 배열의 시작 주소값이므로 arr의 세번째 원소의 주소값은 arr + 2 가 된다. (주소값에 정수를 더하면, 자료형의 크기만큼 더해진다.)

 

이때, arr[2]의 값을 읽고싶으면 주소값이 가리키는 값을 찾으면 되므로 포인터를 이용해주면 된다. 즉 *(arr + 2) 는 arr[2] 와 완벽하게 같은 표현인 것이다.

 

 

만약 p라는 포인터변수가 배열의 첫번째 원소를 가리키게 하려면 다음과 같이 초기화를 해주면 된다.

#include <stdio.h>

int main() 
{
	int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int *p = arr;
}

 

이 상태를 그림으로 그려본다면 

 

이렇게 표현할 수 있다. (arr의 값, 즉 배열의 시작 주소값을 100이라 가정한다.)

아까와 같은 원리로, *p 의 값은 0이고, *(p+2)의 값은 2가 된다.

 

또한, [ ] 연산은 포인터로 나타낼 수 있다고 했으므로 p[2] = *(p+2) 이렇게 표현 할 수 있다.

 

#include <stdio.h>

int main() 
{
	int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int *p = arr;
    
	printf("%d\n", *(p+2));
	printf("%d", p[2]);
}

 

값이 예상대로 출력되었다.

 

 

오늘의 내용을 정리해보면

 

   1. 배열명은 배열이 할당된 메모리주소의 시작값과 일치한다.

 

   2. 배열에서 자주쓰는 [ ] 연산은 포인터로 완벽하게 표현 가능하다. arr[1] = *(arr+1)

 

 

본 게시글은 공부하며 작성한 것이므로 오류가 있을 수 있습니다.