Shine's dev log
[C] 배열과 포인터의 관계 본문
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)
본 게시글은 공부하며 작성한 것이므로 오류가 있을 수 있습니다.
'프로그래밍, 알고리즘' 카테고리의 다른 글
[알고리즘] Insertion sort 란? (0) | 2021.09.24 |
---|---|
[python] face_recognition 라이브러리 pyinstaller 사용시 RuntimeError 오류 해결 (0) | 2021.05.20 |
[C] 깊은복사와 얕은복사 (deep copy, shallow copy) (0) | 2020.07.16 |
[C] 함수의 데이터 공유 방법 (int * 함수) (0) | 2020.03.28 |
[C] char[] 과 char *의 차이에 관하여 (2) | 2020.03.25 |